バグは、defmacro! で可変長引数が取れないというものです。
例えば、
(defmacro! (sum . args) ...
とした時に args を filter して o! シンボルを g! シンボルに置き換えようとするところで、args がまだシンボルのままであるためエラーになるというものです。よって、その処理を書く場所に気をつけて評価順序を制御すれば良いだろうと思って修正を試みていたのですが、なかなかうまくいかず。。悔しいれす(^p^)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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))))) |
猫好きながら猫アレルギーにより鼻水ダラダラを理由に今日は一旦諦めます。。
追記
勘違いだったようです。というか見当違いでした。filter の引数に非リストを渡していたからっぽい。全然見当違いの修正を数時間やってました。。ご飯食べてお風呂入って、再度コードを見たらあっけなく・・・。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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))))) |
0 件のコメント:
コメントを投稿