木谷 洋
ryute****@mac*****
2005年 6月 18日 (土) 12:26:59 JST
On 2005/06/18, at 10:58, Shiro Kawai wrote: > 仕様を完全に理解できていないんですが、こんなんでどうでしょうか。 > > (define-syntax @ > (syntax-rules () > ;; Loop to collect arguments > ((@ "collect" (sels ...) (args ...) target ()) > (objc-send target > (string-append (x->string 'sels) ...) > (list args ...))) > ((@ "collect" (sels ...) (args ...) target (sel arg . more)) > (@ "collect" (sels ... sel) (args ... (@ arg)) target more)) > ((@ "collect" (sels ...) (args ...) target (msg)) ;; special case? > (@ "collect" (sels ... msg) (args ... ()) target ())) > ;; Main entry > ((@ (op . args)) > (@ "collect" () () (@ op) args)) > ((@ obj) ;; base case > obj))) > > これではダメなケースがある、という場合は、正確な仕様を教えて下 > さい。 ありがとうございます。これから追ってみます。 念のため正確な仕様を出すと、 0. マクロ@は続くcdr部をObjective-Cのメッセージ 式と解釈して変換しobjc-sendに渡す。 1. Objective-Cのメッセージ式とは 1.1 単項メッセージ [receiver sel] 1.2 キーワードメッセージ [receiver sel: arg ...] のいずれか。 2. キーワードメッセージのセレクタ部は集積され、単一文字列に変換 される 3. キーワードメッセージの引数は再帰的にObjective-Cのメッ セージ式でありうる 3'.いずれのメッセージ式もreceiverが再帰的にObjective- Cのメッセージ式でありうる 4. 引数ないしreceiverが特殊リスト(~ ...)であった場合 はcdr部を通常のS式と解釈して渡す。つまり ;; items = (1 2 3) (@ [rec sel: (~ car items)]) -> (@ [rec sel: 1]) のように評価される。(実際は展開後の式にcdr部がそのま ま渡る) 付け加えて (objc-send-as ContextClass obj selector (args ...)) なるクラスのsuper呼び出しを代替する関数があり、 5. マクロ(@-as ctx Message-Form)は@と同様だが outermostのメッセージ式のみobjc-send-asに渡すものとして解 釈する。つまり (@-as SuperClass [sub-obj sel: [obj msg]]) -> (objc-send-as SuperClass sub-obj "sel:" (list (obj-send obj "msg" '()))) のようになる。 という線で考えています。@-asは@があればほぼ同様で しょうね。 --- 木谷 洋