В Common Lisp я могу оценить следующий фрагмент кода (в SBCL) без сигнализации любой синтаксической ошибки:Различия между Common Lisp и Scheme лексические закупорки
(let ((x 0))
(defun my-incf (y)
(setf x (+ x y)))
(defun my-decf (y)
(setf x (- x y))))
MY-DECF
CL-USER> (my-incf 1)
1
CL-USER> (my-incf 1)
2
CL-USER> (my-decf 1)
1
CL-USER> (my-decf 1)
0
Когда я пытаюсь оценить соответствующую схему фрагмент код (в DrRacket):
(let ((x 0))
(define (my-incf y)
(set! x (+ x y)))
(define (my-decf y)
(set! x (- x y))))
это сигнализирует синтаксическую ошибку.
begin (possibly implicit): no expression after a sequence of internal definitions in: (begin (define (my-incf y) (set! x (+ x y))) (define (my-decf y) (set! x (- x y))))
Кто-нибудь знает причину, по которой это невозможно сделать на Схеме?
Вам нужно будет изучить синтаксическое определение LET в DrRacket. Пример Common Lisp действителен, но я бы не использовал его в своем коде. –
@Reiner Joswig Почему бы вам не использовать его в своем коде? –
Вместо этого я бы использовал CLOS. Использование выше упрощает отладку и предотвращает распознавание формы DEFUN в качестве определения функции компилятором. Внутри LET DEFUN больше не является формой верхнего уровня. –