« schelogとdefine-macro | Main | schelog その3 »

2007.09.02

schelogと%macroexpand

なんとなくマクロの構文が分かったので、%relを解析してみよう。

(define %knows
(%rel ()
[('Odysseus 'TeX)]
[('Odysseus 'Scheme)]
[('Odysseus 'Prolog)]
[('Odysseus 'Penelope)]
[('Penelope 'TeX)]
[('Penelope 'Prolog)]
[('Penelope 'Odysseus)]
[('Telemachus 'TeX)]
[('Telemachus 'calculus)]))

まずはここから。


(define-macro %rel
(lambda (vv . cc)
`(lambda __fmls
(lambda (__fk)
(call-with-current-continuation
(lambda (__sk)
(let ((! (lambda (fk1) __fk)))
(%let ,vv
,@(map (lambda (c)
`(call-with-current-continuation
(lambda (__fk)
(let* ((__fk ((%= __fmls (list ,@(car c)))
__fk))
,@(map (lambda (sg)
`(__fk ((schelog:deref* ,sg)
__fk)))
(cdr c)))
(__sk __fk)))))
cc)
(__fk 'fail)))))))))

ぱっと見ただけで、2重のcall/ccか。

gcc -E みたいなものを求めてさまよう。
http://www.lingr.com/room/gauche/archives/2007/01/07に発見。

(%macroexpand (%rel () [('Odysseus 'Tex)]))

で展開型が返される。ひげぽんさんに感謝。


(lambda __fmls
(lambda (__fk)
(call-with-current-continuation
(lambda (__sk)
(let ((! (lambda (fk1) __fk)))
(%let ()
(call-with-current-continuation
(lambda (__fk)
(let* ((__fk ((%= __fmls (list 'Odysseus 'Tex)) __fk)))
(__sk __fk))))
(__fk 'fail)))))))

だいぶ見やすくなった。一番外側のlambdaで、引数リストが__fmlsになっている。()でくくられてないけど、良いのかな。再びここで発見。http://karetta.jp/book-node/gauche-hacks/000332 早く、(ry

> ここで、任意の数の引数を渡したい場合はどうすればいいでしょうか? この場合はリストではなく名前(正確にはシンボルと言うべきでしょう。シンボルについては「シンボルとquote」で説明します)を渡します

なるほど。%whichの実装と両側から追っていくか。

|

« schelogとdefine-macro | Main | schelog その3 »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/16315154

Listed below are links to weblogs that reference schelogと%macroexpand :

« schelogとdefine-macro | Main | schelog その3 »