2014-02-26 41 views
9

在使用REPL时,定义函数和宏是非常有用的,特别是如果您尝试为某个东西创建一个宏,然后将其模拟为函数,并且每次都调用该宏。 Common Lisp有可能取消定义吗?Lisp中可能有未定义的宏和函数吗?

+0

另请参阅[如何删除Lisp中的变量/表单?](http://stackoverflow.com/q/21231775/1281433) –

回答

11

是的,你可以使用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。那仍然不时地让我trips trips不安。

+2

在clisp-REPL中,我只键入“(fm”和tabulator,所以我不'不必知道fmak或fmake。 – porky11

9

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

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

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