我试图完全理解编译时宏的局限性。
这是一个宏(我完全知道这不是最佳实践宏):
(defmacro emit (language file &body body)
(print language)
(print file)
(print body)
(with-open-file (str file :direction :output :if-exists :supersede)
(princ (cond ((eq language 'html)
(cl-who:with-html-output-to-string (s nil :prologue t :indent t) body))
((eq language 'javascript)
(parenscript:ps body))
((eq language 'json)
(remove #\; (parenscript:ps body))))
str)))
我编译宏:
; processing (DEFMACRO EMIT ...)
PROGRAM>
我编译这个表格:
PROGRAM> (compile nil (lambda () (emit json "~/file" (ps:create "hi" "hello") (ps:create "yo" "howdy"))))
JSON
"~/file"
((PARENSCRIPT:CREATE "hi" "hello") (PARENSCRIPT:CREATE "yo" "howdy"))
#<FUNCTION (LAMBDA ()) {5367482B}>
NIL
NIL
PROGRAM>
编译时print
输出是我所期望的。
但是,如果我看~/file
:
body
似乎((PARENSCRIPT:CREATE "hi" "hello") (PARENSCRIPT:CREATE "yo" "howdy"))
从未替换过参数body
,因此从未处理过。
为什么是这样?
以及关于这个主题的最佳文学作品是什么?