2016-09-13 7 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

Одна из отличий между Схемой и 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). –