Хорошо, это довольно простой вопрос: я слежу за видео SICP, и меня немного смущают различия между define
, let
и set!
.
1).Сассману в видео define
разрешено прикреплять значение к переменной только один раз (кроме случаев, когда в REPL), в частности, два определения в строке не допускаются.Тем не менее, Guile с радостью запускает этот код
(define a 1)
(define a 2)
(write a)
и выдает 2, как и ожидалось.Все немного сложнее, потому что, если я пытаюсь сделать это (РЕДАКТИРОВАТЬ: после вышеуказанных определений)
(define a (1+ a))
Я получаю ошибку, в то время как
(set! a (1+ a))
разрешено.Тем не менее, я не думаю, что это единственная разница между set!
и define
: что я пропускаю?
2) Разница между define
и let
озадачивает меня еще больше.Я знаю, что в теории let
используется для привязки переменных в локальной области видимости.Тем не менее, мне кажется, что это работает так же с define
, например, я могу заменить
(define (f x)
(let ((a 1))
(+ a x)))
на
(define (g x)
(define a 1)
(+ a x))
и f
и g
работаютТо же самое: в частности, переменная a
также не связана с g
.
Единственный способ увидеть это полезное - это то, что let
может иметь более короткую область действия, чем целое определение функции.Тем не менее, мне кажется, что всегда можно добавить анонимную функцию, чтобы создать необходимую область, и сразу же вызывать ее, как это делается в javascript.Итак, каково реальное преимущество let
?