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 を呼ぶための関数が定義されていますが、 という問題点を感じています。
最初の問題点を解決するために、スクリプトの実行結果を文字列ではなく、 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 の戻り値を得るための型を指定するもので、
例:
(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)
のように使います。
問題点としては、
課題としては、
そもそも AEDesc を Lisp から扱う方針として、 この実装でいいのかは良く判りません。

nand@mac.com     目次へ $Revision: 1.9 $ $Date: 2006/01/17 05:34:55 $