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の実装と両側から追っていくか。
The comments to this entry are closed.


Comments