使用REPL时,定义函数和宏是有帮助的,特别是如果你试图为某个东西制作宏,然后将其模拟为函数,并且每次调用宏。 Common Lisp中是否可以取消定义?
答案 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)
取消定义宏或功能并不意味着此更改会在代码中传播。
如果您有一个宏并希望将其重新定义为函数,那么您还必须重新编译使用该宏的代码。
请注意,如果使用某些优化(内联)编译代码,则需要重新编译更多代码。即使重新定义的函数也可能没有任何效果,直到使用代码也被重新编译。