{}と[]の違い

実は二種類のリストがある

 古くからのAppleScriptユーザーには既知のことかもしれませんが、リストには二種類の書式が存在し、それぞれの実装も微妙に異なります。
 まずは、普段使われている{}によるもので、クラスはvector(複数形はvectors)です。

{1, 2, 3, 4, 5}

 そしてもう一つは[]によるもので、クラスはlinked list(複数形はlinked lists)です。

[1, 2, 3, 4, 5]

 ほとんどの場面で、これらの二つの動作に差はありません。class属性を取り出してみても、どちらもlistです。

linked listの特徴

 詳しくは、Apple Script1.1-Jの「リリースノート(原語)」の中の「General Notes」を参照していただければ判るのですが、簡単にlinked listの特徴を並べると以下の通りです。

  1. メモリ効率がよい。
  2. リストの項目にアクセスするスピードが遅い。
  3. 逆に、リストの前後に項目を付加する操作は速い。
  4. 当然リストの結合も速い。
  5. リストを結合した場合、右側の値が結合後のリストとリンクされる。

 特に「項目の多いリストの注意」で指摘した速度低下を、2の特徴は助長し、3や4の特徴は軽減してくれます。

値のリンクとは?

 1〜4までの特徴はすぐに理解できると思いますが、5番目の「値がリンクされる」というのがもう一つ分りにくいと思います。
 とりあえず、以下のスクリプトを実行してみて下さい。

set x to [1, 2, 3, 4, 5]
set y to [6, 7]
set z to x&y
set item 2 of x to "textX"
set item 2 of y to "textY"
z

 zの値は予想に反して{1, 2, 3, 4, 5, 6, "textY"}となっているはずです。
 なお、結合するときに、&の両辺がlinked listである必要があります。

相互に変換する

 vectorをlinked listに、またはその逆に変換するのは簡単で、as演算子を利用して、問題なく変換されます。

set x to [1, 2, 3, 4, 5]
set y to [6, 7] as vector
set z to x&y
set item 2 of y to "textY"
z

2000-05-29 -2000-11-23