2016-09-13 61 views
1

我有一個關於Common Lisp中函數副本的問題。如何將函數複製到新符號?

在路線我會去用:

(define (foo par1 par2) (+ par1 par2)) 
(define bar foo) 
(print (bar 1 2)) ;; --> prints 3 
(define (foo par1 par2) (* par1 par2)) 
(print (bar 1 2)) ;; --> prints again 3 
(print (foo 1 2)) ;; --> prints 2 

我怎樣才能做到這一點與Common Lisp的?

回答

8

Scheme和Common Lisp之間的差異之一是,Common Lisp具有用於函數和值的單獨命名空間。在計劃中,我們可以設定價值 - 這也是所有。在Common Lisp中,我們需要設置函數而不是值,如果我們想要設置或更改符號的函數。

SYMBOL-FUNCTION爲您提供符號的功能。您可以使用功能(setf symbol-function)來設置符號的功能。看下面的例子:

CL-USER 50 > (defun foo (par1 par2) (+ par1 par2)) 
FOO 

CL-USER 51 > (setf (symbol-function 'bar) (symbol-function 'foo)) 
#<interpreted function FOO 4060000C3C> 

CL-USER 52 > (bar 1 2) 
3 

CL-USER 53 > (defun foo (par1 par2) (* par1 par2)) 
FOO 

CL-USER 54 > (bar 1 2) 
3 

CL-USER 55 > (foo 1 2) 
2 
+0

謝謝,我想我必須以某種方式寫函數的符號,但我不知道該怎麼做。 –

+0

你也可以(setf bar(symbol-function'foo)) - 但是然後調用你將不得不去(** funcall ** bar 1 2)。 –

相關問題