Shiro Kawai
shiro****@lava*****
2005年 6月 18日 (土) 10:58:35 JST
From: 木谷 洋 <ryute****@mac*****> Subject: [Gauche-devel-jp] Re: 埋め込み言語の設計 Date: Sat, 18 Jun 2005 09:45:56 +0900 > (@ [[obj msg] msg1: arg1 msg2: arg2]) > -> > (objc-send (objc-send obj "msg" '()) > "msg1:msg2:" (list arg1 arg2)) ああなるほど。わかりました。 > ああ、やはりそういうことになるんですか。 > 要点だけ取り出すと今はこんなふうになってます。 [snip] (@ FORM) を (letrec-syntax .... ) に展開しているわけですね。 マクロ定義へと展開するマクロ自体はトリッキーではありますが、 特におかしいものではないです。 ただ、たぶん展開時の操作と実行時の操作を混同しておられるのと、 1パスで全部展開しようとしているところで無理が生じているように 思えます。再帰的な構造は、自分自身へのマクロ呼び出しへと展開して 置けば後でコンパイラが再帰的に辿ってくれます。 仕様を完全に理解できていないんですが、こんなんでどうでしょうか。 (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))) これではダメなケースがある、という場合は、正確な仕様を教えて下さい。 --shiro