GNU Emacs / Carbon: do_applescript を拡張してパラメタ渡しと値の獲得を行なえるようにする
[2006/1/15 - 2006/1/17]
[2006/1/17] パッチを更新して、本文をあちこち書き直しました。
Mac OS X 上の GNU Emacs CVS HEAD / Carbon では do_applescript
という AppleScript を呼ぶための関数が定義されていますが、
-
戻り値がテキストのみで、結果の獲得に信頼性を欠く。
特に Unicode の文字列定数を戻した時など、
どんな encoding で返ってくるか事前に決定できない。
-
既に AppleEvent のデータがあっても、これを AppleScript
に直接渡すことができない。
という問題点を感じています。
最初の問題点を解決するために、スクリプトの実行結果を文字列ではなく、
AppleEvent のデータのまま Lisp の表現にできれば良いと考えました。
GNU Emacs CVS HEAD では、
すでに AppleEvent を直接操作するための関数が整えられつつあります。
AppleEvent data (AEDesc) を Lisp 表現にする C の関数も、
型変換の関数も既に用意されているので、
AppleScript の戻り値を Lisp 表現で受け取れるように変更するのは比較的簡単です。
戻り値を AEDesc と互換な Lisp 表現にできても、それを別の AppleScript に
渡せなければ面白くないので、
AppleScript を引数をとって呼び出せるようにしたいところです。
が、Lisp 表現から AEDesc への変換はちょっと面倒です。
黙って見ていてもそのうちどうにかなるんじゃないかなあ、という気もしますが、
自分の勉強も兼ねて、
パッチ (その2)。
(do-applescript script parameter-list desired-type)
と呼び出し、parameter-list と desired-type は省略可能
(省略時動作はパッチ前と同じのはずです)。
parameter-list は、AppleScript にパラメタを渡すためのもので、
(subroutine-name param1 param2 ...) または nil。
subroutine-name は文字列。param1 などは (cons type data) ただし
type と data は (mac-coerce-ae-data src-type src-data dst-type) の
src-type src-data と同じ。
desired-type は、AppleScript の戻り値を得るための型を指定するもので、
-
nil : パッチ前の do-applescript と同じ
-
t : 戻り値そのまま ("****" を指定したのと同じ)
-
4文字の文字列 : 対応する OSType に型変換して返す。
例:
(do-applescript
"on f (l)
tell application \"Finder\" to select l
end f"
(list "f"
(cons "list"
(mapcar (lambda (fn) (cons "alis"
(mac-coerce-ae-data "fNam" fn "alis")))
'("/etc/rc" "/etc/hosts"))))
t)
のように使います。
問題点としては、
-
mac_create_aedesc_from_lisp が
typeAppleEvent の AEDesc を
生成する時に、keyword が Parameter か Attribute か
判別する方法が見つからないので、
AEPutParamPtr を使うべきなのか
AEPutAttributePtr を使うべきなのか
わからない。(とりあえず AEPutParamPtr
を使っていますが、この辺りのコードは全然テストできていません。)
課題としては、
-
desired-list の指定だけで、AppleScript から返ってくる
"alis" のリストを、"fNam" のリストに変換する、
みたいなことができれば便利かもしれない
(Lisp と AEDesc とを何回も行き来するのは効率悪そうですし)。
そもそも AEDesc を Lisp から扱う方針として、
この実装でいいのかは良く判りません。