[Gauche-devel-jp] Re: 埋め込み言語の設計

アーカイブの一覧に戻る

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



Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る