Почему Clojure различает символы и переменные?

Я уже видел этот вопрос , но он не объясняет, что меня интересует.

Когда я впервые пришел к Clojure из Common Lisp, я был озадачен, почему он рассматривает символы и ключевые слова как отдельные типы, но позже я понял это, и теперь я думаю, что это замечательная идея. Теперь я пытаюсь понять, почему символы и переменные являются отдельными объектами.

Насколько мне известно, реализации Common Lisp обычно представляют "символ" с использованием структуры, которая имеет 1 )строку для имени, 2 )указатель на значение символа при оценке в позиции вызова функции, 3 )указатель на его значение при оценке вне позиции вызова, список свойств 4 )и т. д.

Игнорируя различие между Лиспом -1 и Лиспом -2, факт остается фактом: в CL «символический» объект указывает непосредственно на свое значение. Другими словами, CL объединяет в одном объекте то, что Clojure называет «символом» и «переменной».

В Clojure, чтобы вычислить символ, сначала нужно найти соответствующую переменную, , затем переменная должна быть разыменована. Почему Clojure работает именно так?Какая польза может быть от такой конструкции? Я понимаю, что переменные имеют определенные специальные свойства (они могут быть приватными, или константными, или динамическими... ), но нельзя ли просто применить эти свойства к самому символу?

35
задан Community 23 May 2017 в 12:32
поделиться