ハンドラを引数で渡す?

Perl や JavaScript や C 言語や...その他いろいろなプログラム、スクリプト言語では関数ポインタを使って汎用的な関数を作ることがあります。AppleScript で同じようなことができないか...と常々考えていました。

AppleScript は、ハンドラを変数に入れることができるのでこれが使えるかと思いましたが、上手くいきません。しかし、スクリプトオブジェクトを使えば関数ポインタのようなことができます。

Script Editor で開く

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 件のコメント :

コメントを投稿