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

Y.S*_*Y.S 1 lisp scheme common-lisp first-class-functions

我对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
Run Code Online (Sandbox Code Playgroud)

我怎么能用Common Lisp做到这一点?

Rai*_*wig 8

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
Run Code Online (Sandbox Code Playgroud)