曾几何时我正在玩宏并想出了这个:
(defmacro my-recursive-fact (n)
(if (= 0 n) '1
(let ((m (1- n)))
`(* ,n (my-recursive-fact ,m)))))
Run Code Online (Sandbox Code Playgroud)
它奏效了.
CL-USER> (my-recursive-fact 5)
120
Run Code Online (Sandbox Code Playgroud)
那么我认为如果我使用macroexpand以下方法扩展此宏,这可能是向学生展示递归示例的好方法:
CL-USER> (macroexpand '(my-recursive-fact 5))
(* 5 (MY-RECURSIVE-FACT 4))
T
Run Code Online (Sandbox Code Playgroud)
也就是说,在这种情况下macroexpand-1和之间没有区别macroexpand.我确信我在理解中缺少一些关键点macroexpand,HyperSpec对递归宏没有什么特别之处.
而且我仍然很想知道是否有办法将这种宏扩展到最后.
我目前正在编写矢量算术的小实现,我想定义我自己的« - »和«+»(以及其他)函数,它们将在向量上运行.
我还想将所有这些功能放在一个包中.
我想要这个假设的包,比如说它叫做«vec»,表现得像这样:
+和-为cl:+和cl:-,但没有明确地从进口的每一个其他需要的功能的必要性:cl.vec包,或者在:use另一个包的定义部分提到它时,common-lisp包的« - »和«+»仍然可用,并且包vec的函数被调用(vec:+ v1 v2),因此vec:+和之间没有名称冲突cl:+.那么,什么被认为是实现这种行为的最佳(和正确)方式?
我想知道,如果有办法从repl检查已定义和加载的宏的源代码?
排序为macroexpand-1,但没有扩展.