2010/09/23

先日書いた defmacro! がバグっていたので

先日書いたものがバグっていたので、修正しようとしましたが解決できず・・・。
バグは、defmacro! で可変長引数が取れないというものです。
例えば、
(defmacro! (sum . args) ...
とした時に args を filter して o! シンボルを g! シンボルに置き換えようとするところで、args がまだシンボルのままであるためエラーになるというものです。よって、その処理を書く場所に気をつけて評価順序を制御すれば良いだろうと思って修正を試みていたのですが、なかなかうまくいかず。。悔しいれす(^p^)

(define defmacro define-macro)
(defmacro (defmacro/g! name . body)
(let1 syms (cl:remove-duplicates (filter g!-symbol? (flatten body)))
`(defmacro (,(car name) ,@(cdr name))
(let ,(map (lambda (s)
`(,s (gensym ,(remove-mark s)))) syms)
,@body))))
(define-macro (defmacro! name . body)
(let* ((args (cdr name))
(os (filter o!-symbol? args))
(gs (map o!-symbol->g!-symbol os)))
`(defmacro/g! (,(car name) ,@args)
`(let ,(map list (list ,@gs)(list ,@os))
,(begin ,@body)))))
view raw defmacro.scm hosted with ❤ by GitHub


猫好きながら猫アレルギーにより鼻水ダラダラを理由に今日は一旦諦めます。。

追記

勘違いだったようです。というか見当違いでした。filter の引数に非リストを渡していたからっぽい。全然見当違いの修正を数時間やってました。。ご飯食べてお風呂入って、再度コードを見たらあっけなく・・・。


(defmacro (defmacro! name . body)
(let* ((args (cdr name))
(os (filter o!-symbol? (if (dotted-list? args)
(dotted-list->list args)
args)))
(gs (map o!-symbol->g!-symbol os)))
`(defmacro/g! (,(car name) ,@args)
`(let ,(map list (list ,@gs)(list ,@os))
,(begin ,@body)))))
view raw defmacro2.scm hosted with ❤ by GitHub


LET OVER LAMBDA Edition 1.0

0 件のコメント:

コメントを投稿