В Common Lisp я могу оценить следующий фрагмент кода (на SBCL) без сообщения о какой-либо синтаксической ошибке:
(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
Когда я пытаюсь оценить соответствующий фрагмент кода Scheme (в 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))))
Кто-нибудь знает причину, по которой это нельзя сделать в Схеме?
(defvar *counter* 0)
и если функции ссылаются на*counter*
. Подход ООП применяется, если модуль кричит, что я действительно должен быть объектом, поддерживающим множественное создание экземпляров, и все эти глобальные переменные должны быть моими переменными экземпляра. Если вы не ожидаете необходимости многократного создания экземпляров или каких-либо преимуществ наследования и тому подобного, придерживайтесь глобальных переменных. Динамические переменные — это способ Common Lispy делать глобальные переменные. - person Kaz   schedule 28.06.2013