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

por*_*y11 14 lisp macros common-lisp

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

jbm*_*jbm 15

是的,你可以用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}>.
Run Code Online (Sandbox Code Playgroud)

请注意,它确实是fmak而不是fmake.这仍然让我不时骚扰我.

  • 在clisp-REPL中我只输入"(fm"和制表符,所以我不必知道fmak还是fmake. (2认同)

Rai*_*wig 11

取消定义宏或函数并不意味着此更改通过代码传播.

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

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