如何将函数复制到新符号?
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
我有一个关于 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