【发布时间】:2014-03-28 13:09:10
【问题描述】:
在使用 REPL 时,取消定义已定义的函数和宏会很有帮助,特别是如果您尝试为某些东西创建一个宏,然后将其模拟为函数,并且每次都会调用该宏。 Common Lisp 中是否可以取消定义?
【问题讨论】:
标签: macros lisp common-lisp
在使用 REPL 时,取消定义已定义的函数和宏会很有帮助,特别是如果您尝试为某些东西创建一个宏,然后将其模拟为函数,并且每次都会调用该宏。 Common Lisp 中是否可以取消定义?
【问题讨论】:
标签: macros lisp common-lisp
是的,您可以为此使用fmakunbound。
它适用于函数和宏。这是一个示例 REPL 会话:
CL-USER> (defun add (n m) (+ n m))
ADD
CL-USER> (add 1 2)
3
CL-USER> (fmakunbound 'add)
ADD
CL-USER> (add 1 2)
; [snip]
; Evaluation aborted on #<UNDEFINED-FUNCTION ADD {C3305F1}>.
请注意,它实际上是 fmak 而不是 fmake。这仍然不时让我绊倒。
【讨论】:
取消定义宏或函数并不意味着此更改会在代码中传播。
如果你有一个宏并且想将它重新定义为一个函数,那么你还必须重新编译使用该宏的代码。
请注意,如果您使用某些优化(内联)编译代码,则需要重新编译更多代码。即使重新定义的函数也可能无效,直到使用的代码也被重新编译。
【讨论】: