トップページ > プログラム > 2015年03月07日 > 1AfT/MV4

書き込み順位&時間帯一覧

32 位/208 ID中時間01234567891011121314151617181920212223Total
書き込み数2000000000000000000000002



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【入門】Common Lisp その11【質問よろず】

書き込みレス一覧

【入門】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です。動かす方法はありますか?
【入門】Common Lisp その11【質問よろず】
222 :デフォルトの名無しさん[sage]:2015/03/07(土) 00:48:06.97 ID:1AfT/MV4
(defun g!-symbol-p (s)
(and (symbolp s)
(> (length (symbol-name s)) 2)
(string= (symbol-name s)
"G!"
:start1 0
:end1 2)))


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。