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