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

AppleScriptのリスト処理について

発言者:石原勝也
( Date Friday, November 15, 1996 02:35:15 )


AppleScriptのリストで少々分からないことがあります。
以下のスクリプトで、レコード型のリストを作りたいのですが、うまく
いきません。

set item1 to {field1:"aaa", field2:"bbb"}
set item2 to {field1:"ccc", field2:"ddd"}
set myList to {}
set myList to myList & item1
set myList to myList & item2

実行の結果myListは次の通りになってしまいます。
{field1:"aaa", field2:"bbb"}

のぞんでいる結果は
  {{field1:"aaa", field2:"bbb"},{field1:"ccc", field2:"ddd"}}
なんですが...。

勉強不足なのは承知の上なんですが、どなたか、教えて頂けたら幸いです。

田中求之 さんからのコメント
( Friday, November 15, 1996 04:05:38 )

以下のスクリプトで、myList がお望みのようになります

set item1 to {field1:"aaa", field2:"bbb"}
set item2 to {field1:"ccc", field2:"ddd"}
set myList to {}
set end of myList to item1
set end of myList to item2

-> myList = {{field1:"aaa", field2:"bbb"}, {field1:"ccc", field2:"ddd"}}

リストにアイテムを追加していくときには、 set end of XXXX to ...  を使うのが
いいですよ(処理速度もこちらが早い)。

石原勝也 さんからのコメント
( Friday, November 15, 1996 14:56:07 )

フォローありがとうございます。さっそく試してみました。
おかげ様でうまく動作しております。

うまくいったのは良かったんですが、またひとつ疑問がでてきちゃい
ました。もしよかったら、もうひとつご指導いただけますでしょうか?

先程はリストへのアイテムの追加でしたが、逆に削除はできるのでしょう
か?
例えば
  先程の例だとfield1が"ccc"のアイテムを削除
  先頭から数えて何アイテム目を削除
の様な処理です。

田中求之 さんからのコメント
( Friday, November 15, 1996 16:38:17 )

>先程はリストへのアイテムの追加でしたが、逆に削除はできるのでしょう
>か?

これは自分でスクリプトを書いて処理するしかありませんね。

基本的には、削除の条件に満たないものを集めてリストを作りなおすということに
なります。

>field1が"ccc"のアイテムを削除

set myTList to {}
repeat with thisItem in myList
  if field1 of thisItem ュ "ccc" then set end of myTlist to thisItem
end repeat
set myList to myTList

こんな感じの処理を行うことになります。myTList として新しいリストを作って
いくわけです。


田中求之 さんからのコメント
( Friday, November 15, 1996 16:42:50 )

先頭から X 目のアイテムを取り除く場合は(たとえば6アイテム目でしたら)、

set myList to (items 1 thru 5 of myList) & (items 7 thru -1 of myList)

のように、先頭から X-1 目までのアイテムと、X+1目から最後までのアイテムをとり
だして連結すればOKです。

石原勝也 さんからのコメント
( Saturday, November 16, 1996 01:35:13 )

なるほど。もし、これができたら便利だったんですが。アイテムの追加や
削除を本格的にやろうと思うと、リスト処理ではちょっと辛いですね(^_^;)

田中求之 さんからのコメント
( Sunday, November 17, 1996 14:49:50 )

>削除を本格的にやろうと思うと、リスト処理ではちょっと辛いですね(^_^;)

削除用のハンドラーを作っておいて呼び出すようにすれば、それほど面倒ではないと
思いますが? たとえば x 番目のアイテムを削除するのであれば、

on deleteItem(myList, x)
  return ((items 1 thru (x - 1) of myList) & (items (x + 1) thru -1 of myList))
end deleteItem

というハンドラーを作っておいて、これを呼び出せばよいわけですよね。
(本格的に使うのなら、エラーチェックを入れたハンドラーにする必要が
ありますが)

天野@NIHS・大阪 さんからのコメント
( Monday, November 18, 1996 17:24:03 )

毎度質問ばかり割り込ませていただいて恐縮ですが、リスト型のデータを
スクリプト内の処理でソートするコマンドはあるのでしょうか?ファイル
メーカーでソートしたデータを取り出すのがどうもうまくいかないもので。
よろしくお願いします。

田中求之 さんからのコメント
( Monday, November 18, 1996 19:46:03 )

ACME Script Widgets というシェアウェアの osax がリストをソートする
コマンドを持っています。これを使うしかないでしょうね。



→  ACME Technologies Products