【问题标题】:Is it possible in Lisp to undefine Macros and Functions?在 Lisp 中是否可以取消定义宏和函数?
【发布时间】:2014-03-28 13:09:10
【问题描述】:

在使用 REPL 时,取消定义已定义的函数和宏会很有帮助,特别是如果您尝试为某些东西创建一个宏,然后将其模拟为函数,并且每次都会调用该宏。 Common Lisp 中是否可以取消定义?

【问题讨论】:

标签: macros lisp common-lisp


【解决方案1】:

是的,您可以为此使用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。这仍然不时让我绊倒。

【讨论】:

  • 在 clisp-REPL 中我只输入 "(fm" 和制表符,所以我不必知道是 fmak 还是 fmake。
【解决方案2】:

取消定义宏或函数并不意味着此更改会在代码中传播。

如果你有一个宏并且想将它重新定义为一个函数,那么你还必须重新编译使用该宏的代码。

请注意,如果您使用某些优化(内联)编译代码,则需要重新编译更多代码。即使重新定义的函数也可能无效,直到使用的代码也被重新编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多