如何将函数复制到新符号?

How do I copy a function to a new symbol?

我有一个关于 Common Lisp 中函数副本的问题。

在 Scheme 中我会选择:

(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 做到这一点?

Scheme 和 Common Lisp 之间的一个区别是,Common Lisp 对函数和值有单独的命名空间。在 Scheme 中,我们可以设置值——这也是全部。在 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