В 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, который довольно ограничен по размеру и никогда не собирает мусор.

Другие вопросы по тегам