我正在尝试在 common lisp 中模拟方案的单个命名空间,并使用扩展为 lambda 的宏(基于 Doug Hoyte),其中函数位置中f!
符号(类似于 Doug Hoyteo!
和符号)的每次使用都会扩展为g!
相同的表达式,但funcall
在每次调用的函数位置添加。例如:
(fplambda (f!z x) (f!z x x))
将扩展为:
(LAMBDA (F!Z X) (FUNCALL F!Z X X))
宏当前如下所示:
(defmacro fplambda (parms &body body)
(let ((syms (remove-duplicates
(remove-if-not #'f!-symbol-p
(flatten body)))))
`(lambda ,parms
(macrolet ,(mapcar
(lambda (f)
`(,f (&rest parmlist) `(funcall ,',f ',@parmlist)))
syms))
,@body)))
但鉴于上述输入,它(据我所知)扩展到:
(LAMBDA (F!F X)
(MACROLET ((F!F (&REST PARMLIST) `(FUNCALL ,'F!F ',@PARMLIST))))
(F!F X X))
在宏定义中,F!F 不应该被引用或不被引用,而 parmlist 应该只是不被引用。到底是怎么回事?提前致谢!