set!
только изменяет привязку символа, часто позволяя сборщику мусора использовать свое первоначальное значение. Он не изменяет данные, он связывает символ. Следовательно, такие вещи, как (set! (car '(symbol symbol2)) 3)
, не работают, даже если вторая подчиненная форма имеет значение символа.
Чтобы действительно изменять данные в памяти, необходимо использовать одну из форм set-car!
, set-cdr!
, set-vector!
и так далее. Они имеют совершенно разную семантику и действительно оценивают свою вторую подформу, и любые данные, которые она оценивает, затем обновляются в памяти, изменяя значение всех других символов, которые совместно используют эту память.