Я уже видел этот вопрос, но это не объясняет, о чем мне интересно.
Когда я впервые пришел к Clojure из Common Lisp, я был озадачен, почему он рассматривает символы и ключевые слова как отдельные типы, но позже я понял это, и теперь я думаю, что это замечательная идея. Теперь я пытаюсь разобраться, почему символы и vars являются отдельными объектами.
Насколько я знаю, реализации Common Lisp обычно представляют собой "символ" , используя структуру, которая имеет 1) строку для имени, 2) указатель на значение символа при оценке в позиции вызова функции, 3) a указатель на его значение при оценке вне позиции вызова и 4) список свойств и т.д.
Игнорируя различие Lisp -1/Lisp -2, факт остается фактом: в CL объект "символ" указывает прямо на его значение. Другими словами, CL объединяет то, что Clojure вызывает "символ" и "var" в одном объекте.
В Clojure, чтобы оценить символ, сначала нужно найти соответствующий var, тогда var должен быть разыменован. Почему Clojure работает таким образом? Какая польза от такого дизайна может быть? Я понимаю, что у vars есть определенные специальные свойства (они могут быть частными или const или динамическими...), но не могли ли эти свойства просто применяться к самому символу?