- 【入門】Common Lisp その11【質問よろず】
221 :デフォルトの名無しさん[sage]:2015/03/07(土) 00:42:51.80 ID:1AfT/MV4 - LET OVER LAMBDAを読んでいるのですが
しょっぱなで出てくるマクロdefmacro/g!が動きません。 (defmacro defmacro/g! (name args &rest body) (let ((syms (remove-duplicates (remove-if-not #'g!-symbol-p (flatten body))))) `(defmacro ,name ,args (let ,(mapcar (lambda (s) `(,s (gensym ,(subseq (symbol-name s) 2)))) syms) ,@body)))) (macroexpand-1 '(defmacro/g! nif (expr pos zero neg) `(let ((,g!result ,expr)) (cond ((plusp ,g!result) ,pos) ((zerop ,g!result) ,zero) (t ,neg))))) ;=>(DEFMACRO NIF (EXPR POS ZERO NEG) (LET () `(LET ((,G!RESULT .. (flatten '`(let ,g!result))が (SB-INT:QUASIQUOTE LET ,G!RESULT)になるので ,g!resultがremove-if-notを通り抜けられないのが理由でしょうか。 sbcl1.2.7です。動かす方法はありますか?
|