Perl や JavaScript や C 言語や...その他いろいろなプログラム、スクリプト言語では関数ポインタを使って汎用的な関数を作ることがあります。AppleScript で同じようなことができないか...と常々考えていました。
AppleScript は、ハンドラを変数に入れることができるのでこれが使えるかと思いましたが、上手くいきません。しかし、スクリプトオブジェクトを使えば関数ポインタのようなことができます。
script MaxObject
on comp(x, y)
return x is less than y
end comp
end script
script MinObject
on comp(x, y)
return x is greater than y
end comp
end script
on run
minOrMax({19, 16, 13, 10, 15, 20, 8}, MinObject)
end run
on minOrMax(theList, theObject)
set firstItem to item 1 of theList
set restList to rest of theList
repeat with i from 1 to count of restList
if theObject's comp(firstItem, item i of restList) then set firstItem to item i of restList
end repeat
return firstItem
end minOrMax
minOrMax() ハンドラは、リストの中の最小値(もしくは、最大値)を返すハンドラです。このハンドラにスクリプトオブジェクトを渡し、スクリプトオブジェクトで定義しているハンドラを呼び出しています。関数ポインタという感じではないですが...他に適切な呼び方を知りません。こういう方法をなんというのでしょう?
肝は、スクリプトオブジェクト内で同じ名前の比較ハンドラ(comp() ハンドラ)を定義していることです。こうすることで同一名のハンドラを複数作成することができ、かつ、渡すスクリプトオブジェクトによりハンドラの挙動を変えることができます。これって、よく知られているスクリプトオブジェクトの使い方なんでしょうか?
スクリプトオブジェクトは、まだまだ便利に使えそうです。もっと、研究しなくては...。
0 件のコメント :
コメントを投稿