В Clojure, почему есть строки, ключевые слова и символы?
Я нахожусь в процессе изучения Clojure и не могу понять некоторые решения по проектированию языка. Почему язык с неизменяемыми строками, такими как Clojure, также нуждается в типах данных Keywords и Symbols? Разве строки не могут иметь дополнительные пространства имен и метаданные и все такое? Для неизменяемых строк сравнение может быть просто идентичной базой, не так ли?
Или, поскольку взаимодействие с Java является обязательным условием для Clojure, по крайней мере, имейте тип Java String и тип данных KeywordSymbol.
Я нахожу эту строку / ключевое слово / символ "трихотомия" особенно странной, поскольку Clojure кажется очень сосредоточенным на "чистоте" и простоте в других аспектах.
2 ответа
Они исполняют самые разные роли в языке:
- Вары используются, чтобы дать имена вещам. Они реализуют
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>
ключевые слова оценивают сами
Я думаю, что Clojure ценит "практичность" (если это правильное слово) несколько больше, чем "чистота". Это видно по тому факту, что Clojure имеет синтаксис для карт, векторов и наборов в дополнение к спискам и использует его для определения языка. В схеме, которая гораздо больше касается чистоты (IMO), у вас есть только синтаксис для списков.
Как Артур Ульфельдт указывает на строки, ключевые слова и символы имеют свои предполагаемые варианты использования. И использование их по назначению облегчает чтение кода Clojure. Это похоже на то, что происходит с HTML 5, который добавляет семантическую разметку. Вещи как <article>
а также <section>
, который вы можете представить с <div class="article">
а также <div class="section">
в HTML 4.
О, и вы ошибаетесь, сравнивая строки только по тождеству. Это гарантированно работает только для интернированных строк. И вы не хотите интернировать слишком много строк, так как они хранятся в так называемом permgen, который довольно ограничен по размеру и никогда не собирает мусор.