Вопрос для знатоков лиспа =)
Сейчас читаю SICP. До этого на лиспе никогда не писал. Параллельно смотрю на Common Lisp.
Возникла вот непонятка:
Почему в Common Lisp так странно выглядят замыкания??(по сравнению с Scheme)
И зачем нужен funcall?(см. пример)
Для сравнения:
Scheme:
> (define (tst x)
> (lambda (y) (+ x y)))
> ((tst 2) 2) ; Все OK.
4
Common Lisp:
* (defun tst (x)
* (lambda (y) (+ x y)))
* ((tst 2) 2) ; Бида
; in: LAMBDA NIL
; ((TST 2) 2)
;
; caught ERROR:
; illegal function call
;
; compilation unit finished
; caught 1 ERROR condition
* (funcall (tst 2) 2) ; Зачем нужен funcall??[br]
4
Аналогично:
Scheme:
> (((lambda (y) (lambda (x) (+ x y))) 5) 5)
10
Common Lisp:
* (((lambda (y) (lambda (x) (+ x y))) 5) 5) ; Почему не прокатило??
; in: LAMBDA NIL
; (((LAMBDA (Y) (LAMBDA (X) (+ X Y))) 5) 5)
;
; caught ERROR:
; illegal function call
;
; compilation unit finished
; caught 1 ERROR condition
* (funcall ((lambda (x) (lambda (y) (+ x y))) 5) 5) ; С funcall'ом все работает почему-то...
10
Насколько я понял из вики различия связаны с lisp-1 и lisp-2.