木谷 洋
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))) これがどうにも魔術的な感じで、将来もちゃんと動くのか不安でして。 --- 木谷 洋