2014-02-26 81 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

取消定義宏或函數並不意味着此更改傳播通過代碼。

如果你有一個宏並想重新定義它作爲一個函數,那麼你也必須重新編譯使用宏的代碼。

請注意,如果您編譯的代碼具有某些優化(內聯),則需要重新編譯更多代碼。即使重新定義的函數也可能沒有效果,直到使用的代碼也被重新編譯爲止。