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でこれを行うにはどうすればよいですか?

4

1 に答える 1

8

Scheme と Common Lisp の違いの 1 つは、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
于 2016-09-13T19:26:34.453 に答える