В Clojure, почему строки, ключевые слова и символы?

Я участвую в процессе обучения Clojure, и я не могу понять некоторые решения по разработке языка: почему языку с неизменяемыми строками типа Clojure также нужны типы данных и символы символов? Не могли ли строки иметь необязательные пространства имен и метаданные и все это? Сравнение неизменяемых строк также может быть базой идентификации, no?

Или, поскольку взаимодействие с Java должно иметь для Clojure, по крайней мере, иметь тип строки Java и тип данных KeywordSymbol.

Я считаю, что это трихотомия String/Keyword/Symbol, особенно странная, поскольку Clojure кажется очень сосредоточенной на "чистоте" и сохраняя вещи простыми в других аспектах.

Ответ 1

Они заполняют очень разные роли в языке:

  • Классы используются для обозначения имен. Они реализуют runnable и могут использоваться непосредственно для вызова функций. Вы не можете запустить строку.
  • Ключевые слова являются именами сами по себе и выглядят на картах. Они действительно помогают Clojure сохранять свой "управляемый данными" вкус. Строки не реализуют требуемые интерфейсы, чтобы выглядеть на картах.
  • Строки - это просто строки. Они делают то, что им нужно делать, и не намного больше.

Одним из основных принципов в дизайне Clojure был охват вашей платформы хоста, поэтому в Clojure строки являются строками Java, и вам никогда не нужно обертывать строку Java в некотором convert-to-clojure-string, чтобы получить его в экосистеме Clojure. Это потребовало использования немодифицированных строк Java, а также числовых типов. Ключевые слова и символы - это новые конструкции, которые добавляются Clojure, поэтому необходимо только сделать их доступными полезными способами из остальной экосистемы Java. Символы и ключевые слова становятся доступными, просто будучи классами, реализующими интерфейс. Вначале считалось, что для того, чтобы новый язык преуспел в экосистеме JVM, ему необходимо было полностью охватить Java и свести к минимуму "несоответствие импеданса" (извините за жужжание), даже если это потребовало добавления большего количества языка, чем были необходимы без этой цели.

изменить:


Вы можете превратить символ в ключевое слово def в него самостоятельно

user> a
; Evaluation aborted.
user> :a
:a
user> (def a 'a)
#'user/a
user> a
a
user> 

ключевые слова оценивают себя

Ответ 2

Я думаю, что Clojure означает "практичность" (если это правильное слово) несколько больше, чем "чистота". Это видно из того факта, что Clojure имеет синтаксис для карт, векторов и множеств в дополнение к спискам и использует его для определения языка. В Scheme, который гораздо больше касается чистоты (IMO), у вас есть только синтаксис списков.

Как указывает Артур Ульфельдт, строки, ключевые слова и символы имеют свои предполагаемые варианты использования. И использование их по назначению облегчает чтение кода Clojure. Он похож на то, что происходит с HTML 5, который добавляет смысловую надбавку. Такие вещи, как <article> и <section>, которые вы можете представить с помощью <div class="article"> и <div class="section"> в HTML 4.

OH, и вы ошибаетесь в сравнении строк только по идентичности. Это гарантированно работает только для интернированных строк. И вы не хотите ставить слишком много строк, поскольку они хранятся в так называемом перменце, который довольно ограничен по размеру и никогда не собирает мусор.