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

アーカイブの一覧に戻る

木谷 洋 ryute****@mac*****
2005年 6月 18日 (土) 09:45:56 JST


すいません、変な書き方しちゃいました。

On 2005/06/18, at 8:40, Shiro Kawai wrote:
> ちょっと質問の要点がよくわからなかったのですが、Scheme式
>>    [[obj msg] msg1: arg1 msg2: arg2]
> を、
>> (objc-send (objc-send obj "msg" '())
>>        "msg1:msg2:" (list arg1 arg2))
> に展開したいってことでしょうか?
そうです。この外側にマクロキーワードがあって、埋め込み分 
[...]をobjc-sendに渡すように解釈したい、という動機になりま 
す。

(@ [[obj msg] msg1: arg1 msg2: arg2])
->
(objc-send (objc-send obj "msg" '())
        "msg1:msg2:" (list arg1 arg2))

ですね。


> それと、R5RS macroだけでは入力式にあるシンボルを出力式に
> 文字列として埋め込むことはできないはずですが、どうしてるので 
> しょう。
ああ、やはりそういうことになるんですか。
要点だけ取り出すと今はこんなふうになってます。

(define-macro (@ form)
   `(letrec-syntax
        ((objc-args
      (syntax-rules (~)
        ;; collected. return by values ("sel1:sel2:.." / '(arg1  
arg2 ...))
        ((_ sels args)
         (values (string-join (reverse sels) "") (reverse args)))

        ;; recursive send form. (ex: [obj msg1: [other msg2]])
        ((_ sels args sel: (head msg ...)  rest ...)
         (objc-args (cons (symbol->string 'sel:) sels)
                (cons (objc head msg ...) args)
                rest ...))
        ;; liner argument parse
        ((_ sels args sel: arg rest ...)
         (objc-args (cons (symbol->string 'sel:) sels)
                (cons arg args)
                rest ...))
     (objc
      (syntax-rules (~)
        ;; recursive receiver form
        ((_ (target msg ...) sel: arg rest ...)
         (call-with-values
         (lambda ()
           (objc-args '() '() sel: arg rest ...))
           (lambda (selector args)
         (objc-send (objc target msg ...) selector args))))

        ;; flat objc form
        ((_ target sel: arg rest ...)
         (call-with-values
         (lambda ()
           (objc-args '() '() sel: arg rest ...))
           (lambda (selector args)
         (objc-send target selector args))))
      (objc , @ form)))

これがどうにも魔術的な感じで、将来もちゃんと動くのか不安でして。

---
木谷 洋





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