小编ale*_*rov的帖子

Common Lisp递归宏扩展

曾几何时我正在玩宏并想出了这个:

(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对递归宏没有什么特别之处.

而且我仍然很想知道是否有办法将这种宏扩展到最后.

macros common-lisp

9
推荐指数
2
解决办法
1154
查看次数

在lisp包中重新定义内置函数的方法

我目前正在编写矢量算术的小实现,我想定义我自己的« - »和«+»(以及其他)函数,它们将在向量上运行.

我还想将所有这些功能放在一个包中.

我想要这个假设的包,比如说它叫做«vec»,表现得像这样:

  • 在包内部,我定义了函数« - »和«+»,但是当我调用 +或 - (在同一个包中)时,调用Common Lisp内置函数.
  • 如果以前是不可能的,我想打电话给内置+-cl:+cl:-,但没有明确地从进口的每一个其他需要的功能的必要性:cl.
  • 当我导入vec包,或者在:use另一个包的定义部分提到它时,common-lisp包的« - »和«+»仍然可用,并且包vec的函数被调用(vec:+ v1 v2),因此vec:+和之间没有名称冲突cl:+.

那么,什么被认为是实现这种行为的最佳(和正确)方式?

packages common-lisp

5
推荐指数
1
解决办法
142
查看次数

检查常见的lisp宏源

我想知道,如果有办法从repl检查已定义和加载的宏的源代码?

排序为macroexpand-1,但没有扩展.

macros common-lisp

1
推荐指数
1
解决办法
347
查看次数

标签 统计

common-lisp ×3

macros ×2

packages ×1