このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

AppleScriptの[]によるリスト

発言者:とんび
( Date Friday, May 21, 1999 19:35:27 )


 皆さん、こんにちは。

 さて、最近一生懸命AppleScriptをやっているのですが、
ちょいと判らないことがあります。
 どうも、{}だけではなく[]を使ってもリストを作れるらしいのですが、
両者の違いって、どこにあるのでしょうか?

 ついでに、自分のページの宣伝もさせてもらいます(笑)
  ↓

→  鳶嶋工房

田中求之 さんからのコメント
( Friday, May 21, 1999 23:23:19 )

>どうも、{}だけではなく[]を使ってもリストを作れるらしいのですが、
>両者の違いって、どこにあるのでしょうか?

内部的にリストのデータをどのように保持するかが異なります。

以前、Apple がドキュメントで配付してたことがあります(確か AS 
1.1 が出たころだったと思います)ので、あとで探してみます。

とんび さんからのコメント
( Saturday, May 22, 1999 00:33:07 )

 どうも、お手数かけます。

 AppleScriptの基本部分の、リファレンス作ってるんですが、
けっこう良く判らないことが多いんですね。
 最近、Appleさんが、資料を出してくれるようになったから、
そちらも、よく読んでみようかと思います。

 それから、HyperCardとAppleScriptの連係についての
ページの製作も始めました。

→  AppleScript基礎講座

田中求之 さんからのコメント
( Saturday, May 22, 1999 02:54:25 )

>以前、Apple がドキュメントで配付してたことがあります(確か AS 
>1.1 が出たころだったと思います)ので、あとで探してみます。

AppleScript 1.1 の英語版に付属していたドキュメント(General 
Notes)に詳しい説明が書かれていました(現在公開されている 
AppleScript 1.3.4 SDK では見つけられませんでした …どっかにある
のかな?)。

もし正確な話を知りたいときには、このドキュメントを見つけて読まれ
ることをお勧めします。リストに関して技術的に面白い話が書かれてい
ます。

AppleScript 1.1 になる時点で、Apple は、リストの内部的な形式を、
Linked List から Vector に変更したのですが、変更前の Linked List 
形式のリストを生成させたいときに、[ ] を使えるようにした、という
のが、技術的な大ざっぱな話です。

細かな話は省略して簡単に言うと、[] で生成されるリストは、リストの
末端に項目を追加する処理は早いし、メモリーの無駄が少ないけれども、
n番目の項目の値を取り出そうとしたときnに比例して遅くなるという
欠点があります。

それに対して、1.1 以降の vector で保持されたリストは、メモリーの
無駄が生じるけれども、個々の項目に対するアクセスは速いという特徴
があります。

で、Apple が言うには、リストの項目の追加・結合より、リストの項目
に対するアクセスの方が、思っていたより多く行われているようなので、
パフォーマンスをよくするために変更を行ったということです(っても、
実質的に AppleScript が使われるようになったのは 1.1 からですから、
その違いが意味を持った人は少ないと思いますが)。

ドキュメントには、再帰的な操作を行うときには Linked list の方がメ
モリーの消費量が少ないとして、以下のようなサンプルが載ってます。

on SumOfSquares(theList)
  if theList = {} then
    return 0
  else
    set element to first item of theList
    return (element * element) + SumOfSquares(rest of theList)
  end if
end SumOfSquares

数字のリストを渡すと、それぞれを二乗した和を返すものですが、この
場合、1.1 以降の vector 型では、rest of theList の部分で、元のリ
ストから先頭の項目以外をコピーした新たなリストが作られることにな
り、メモリーの消費が増えるそうです。

また、リストを結合した時の動作が異なります。以下の2つのスクリプ
トでは、最終的な z の値が異なります。

set x to [1, 2, 3]
set y to [4, 5, 6]
set z to x & y
set item 2 of y to 999
z --> {1, 2, 3, 4, 999, 6}

set x to {1, 2, 3}
set y to {4, 5, 6}
set z to x & y
set item 2 of y to 999
z --> {1, 2, 3, 4, 5, 6}

リストを結合して新たな変数にセットしたとき、Linked list の場合は、
右側のリスト(y)が、結合したリスト(z)と共有されます。もっとも、
この場合は、{} の時の動作の方が、直感的に期待するものとしてはふさ
わしいわけで、Apple もそのように変更したと言ってます。

ということで、General Notes から [] に関する部分の要約の紹介でし
た。

とんび さんからのコメント
( Sunday, May 23, 1999 14:44:46 )

 なるほど、かなりすっきり判りました。

 AppleScript1.1日本語版の「リリースノート(原語)」の中に「General Notes」も
入っていました。これから、ゆっくり読んでみようと思います。


 AppleScript1.1は以下でダウンロードできて、リリースノートはDISK2に入っています。

→  Apple Script1.1-J