« 今日のいまさら | Main | schelogと%macroexpand »

2007.09.01

schelogとdefine-macro

ロジックプログラミングの勉強にschelogを使ってみる。

入手先は、Programming in Schelogから。付属のinstall方法は情報が古いのか、schelog.scmを読み込むだけでgaucheでも普通に使えている。

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

%relを使って、で%knowsというpredicateを定義。%whichで問い合わせ。

(%which ()
(%knows 'Odysseus 'TeX))
=> ()true

(%which ()
(%knows 'Telemachus 'Scheme))

=> #f

動きを追いたいけど、define-macroの動きが分からない。schemeに関する本が一冊くらい欲しいな。

一番簡単そうなこれから。

;%let introduces new logic variables

;(define-syntax %let
; (syntax-rules ()
; ((%let (x ...) . e)
; (let ((x (schelog:make-ref)) ...)
; . e))))

(define-macro %let
(lambda (xx . ee)
`(let ,(map (lambda (x) `(,x (schelog:make-ref))) xx)
,@ee)))

まずは、(lambda (xx . ee) の.で躓く。ここに回答を見つけた。早くgauche本でないかな。
http://karetta.jp/book-node/gauche-hacks/000332
> 手続き引数の記述のなかで.(ドット)記号に続いて引数名を書くと、任意の個数以上の引数をとる手続きが書
> けます。

次、バッククオート`
http://karetta.jp/article/book/016206/016217/
> quasiquoteも式を評価せずそのまま返します。 quoteとの違いは、式の中でunquoteが使える点です。
なるほど。gauche本出たら、2冊くらい欲しい。

> unquoteは,(カンマ)記号で代用できます
`と,がペアか。

@も分からない。とりあえずlambdaを見やすくして、define-macroの本体を抜き出すと、

`(let ,(map (lambdaでくくった関数) xx)
,@ee)
僕の知っているletの構文と違う。ちょっと考えて分かった。,(mapの部分でunquoteされて、mapが評価されて間に入り、いつもの構文になるのか。

独習 Scheme 三週間から、,@も見つけた。,@は,と@の組み合わせではなく、,@で一つの意味がある。展開したときに、外側の括弧を取り除く。上の例だと、eeに手続きのリストを渡すと、マクロ展開時に順番に実行されるようだ。もう少しがんばろう。

今日分かったこと。

こんな感じでリストを作る。
(define lv (list (list 'x 1) (list 'y 2)))
gosh> lv
((x 1) (y 2))

こうやって、xとyを足す手続きが定義できる。
(define-macro foo (lambda () `(let ,lv (+ x y))))
gosh> (foo)
3

(define lv (list (list 'x 10) (list 'y 10)))でlvを再定義すると、define-macroを再評価しなくても、変更が有効になる。この例だと、fooが評価されるときに始めてマクロの展開をしているから。
gosh> (foo)
20

なんだか、何でもありだな。

ついでに、SICP読んでようやくここの意味が分かった。手続きを作るときに、frameをコピーして手続きにくっつけるから。
http://karetta.jp/book-node/gauche-hacks/007232

|

« 今日のいまさら | Main | schelogと%macroexpand »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

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

Listed below are links to weblogs that reference schelogとdefine-macro :

« 今日のいまさら | Main | schelogと%macroexpand »