Была уже похожая тема, но я до конца так и не понял, поэтому решил возвратится. Я не понимаю, как передаются параметры в функцию.
(define a 1)
(define tst (lambda(x) (write (eq? x a))))
(tst a); #t
Передача параметров по значению. Формальному параметру присваивается значение фактического параметра. В этом случае формальный параметр будет содержать копию значения
https://ru.wikipedia.org/wiki/Подпрограмма
У нас же, оба символа указывают на ту же область. НО:
(define tst2 (lambda(x) (set! x 'new_value) (write (eq? x a))))
(tst2 a); #f
и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических.
Получается, мы передаем по ссылке, но когда изменяем, создается новое значение. Причем, это работает только с set! но не с vector-set! set-car! и пр.
В итоге, мы, вроде, имеем то, что все передается по ссылке, но с set! у нас процедуры ведут себя так, как будто передаем по значению. Я пока на этом остановился.
Нахрена они все так запутали? Они память экономят, или что?