マクロ 99問 P01 補足 — #:g1

Posted 2011-01-16 05:02:00 GMT

M-99の前回の回答ですが、コメント欄にて色々と教えて頂きました。ありがとうございます!

lkozima2011/01/15 23:31
こんな書き方もできますね。慣れてないと読めなそうですが。
(defmacro listq (&rest args) `',args)
なるほど!、確かにこちらの方が簡潔です。
解釈としては、
`(quote ,'(a b c d))
となっていて、quoteされた式をunquoteした中身でquote式を作成する、という感じです。
前回の自分の回答は、
`(list ,@(mapcar (lambda (x) `(quote ,x)) '(a b c d))))
というような感じで、(list 'a 'b 'c 'd)を作成しています。
defmacroの&restが毎回新規にリストを作成するならばどちらも同じことな気もしますが、ちょっと追い切れていません。
SaitoAtsushi2011/01/16 09:17
syntax-rules だと再帰的にしなくても出来ますよ。
(define-syntax listq
  (syntax-rules ()
    ((_ arg ...) (list 'arg ...))))
なるほど、パターンマッチで全部解決できるのですね!。これは勉強になります。

ついでなので他のLISP方言でもやってみました。

Dylan

DylanのシンボルのLISP風解釈が良く分からず挫折。
具体的には、変数の名前をシンボルに変換することが可能なのかどうか分かりませんでした。
また、Dylanでは、シンボルは、foo:や、#"foo"と表記できますが、quoteは必要なかったりします。
しかし、実はできたりするのかもしれません。

GOO

(ds listq (,@args) `',args)

(ds listq (,@args) `(list ,@(map (op list 'quote _) args)))

Arc

(mac listq args `',args)

(mac listq args `(list ,@(map [list 'quote _] args)))

GOOもArcも伝統マクロなのでCLと同じになります。

色々試してみるとシンボルの扱いがからんできていて割とLISPのマクロを前提とした問題な気がしてきました。
第1問目としてはあまり良くないかもしれないですね。

comments powered by Disqus