是否有可能在Lisp中取消定义宏和函数?

时间:2014-02-26 00:05:40

标签: macros lisp common-lisp

使用REPL时,定义函数和宏是有帮助的,特别是如果你试图为某个东西制作宏,然后将其模拟为函数,并且每次调用宏。 Common Lisp中是否可以取消定义?

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:10)

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

如果您有一个宏并希望将其重新定义为函数,那么您还必须重新编译使用该宏的代码。

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