Каковы допустимые символы в ключе Clojure?

Я ищу список допустимых символов в ключе clojure. В частности, мне интересно узнать, разрешен ли какой-либо из следующих символов: - _ /.

Я не программист на Java, поэтому я бы не знал оснований, если они есть. Я не знаю, сопоставлено ли ключевое слово clojure ключевому слову java, если есть такая вещь.

Ответы

Ответ 1

Изменить:

Когда я изначально составил этот ответ, я, вероятно, слишком сильно инвестировал в вопрос "С чем вы можете избавиться?" Тем не менее, справедливости ради меня, проблема приемлемости ключевого слова, по-видимому, еще не решена. Итак:

Во-первых, немного о ключевых словах для новых читателей:

  • Ключевые слова поставляются в двух вариантах, квалифицированных и неквалифицированных. Неквалифицированные ключевые слова, такие как :foo, не имеют компонента пространства имен. Квалифицированные ключевые слова выглядят как :foo/bar, где часть до слэша - это пространство имен, якобы. Ключевые слова не могут быть отнесены и могут быть предоставлены несуществующим пространством имен, поэтому их поведение пространства имен отличается от других объектов Clojure.
  • Ключевые слова могут быть созданы либо литералами для читателя, например :foo, либо функцией keyword, которая является (keyword name-str) или (keyword ns name).
  • Ключевые слова оцениваются только для себя, в отличие от символов, указывающих на vars. Обратите внимание, что ключевые слова не являются символами.

Что официально разрешено?

В соответствии с документацией для чтения разрешена одна косая черта, нет периодов в имени и всех правил, связанных с символами.

Что на самом деле разрешено?

В читателе допускается более или менее ничего, кроме пробелов. Например,

user> :-_./asdfgse/aser/se
:-_./asdfgse/aser/se

Появляется законным. Пространство имен для указанного выше слова:

user> (namespace :-_./asdfgse/aser/se)
"-_./asdfgse/aser"

Таким образом, пространство имен должно состоять из всего до последней косой черты.

Функция keyword еще более разрешима:

user> (keyword "////+" "/////")
:////+//////
user> (namespace (keyword "////+" "/////"))
"////+"

И аналогично, пробелы тоже прекрасны, если вы используете функцию keyword. Я точно не знаю, какие ограничения относятся к символам Unicode, но REPL, похоже, не жалуется, когда я помещаю произвольные символы.

Что может произойти в будущем:

Были некоторые ошибки, связанные с проверкой ключевых слов по мере их интернирования. Предположительно один из самых длинных открытых clojure билетов связан с проверкой ключевых слов. Таким образом, функция ключевого слова может перестать быть настолько разрешительной в будущем, хотя это, кажется, в воздухе. См. Билет на сборку и обсуждение в группе google.

Ответ 2

"Правильный" ответ документирован:

Символы начинаются с нечислового символа и могут содержать буквенно-цифровые символы и *, +,!, -, _ и? (в конце будут разрешены другие символы, но не все макрокоманды были определены). '/' имеет особое значение, его можно использовать один раз в середине символа, чтобы отделить пространство имен от имени, например. мои-имена/Foo. '/' сам по себе называет функцию деления. '' имеет особое значение - он может использоваться один или несколько раз в середине символа для обозначения полностью квалифицированного имени класса, например. java.util.BitSet, или в именах пространств имен. Символы, начинающиеся или заканчивающиеся на '.' зарезервированы Clojure. Символы, содержащие/или. считаются "квалифицированными". Символы, начинающиеся или заканчивающиеся на:: зарезервированы Clojure. Символ может содержать один или несколько не повторяющихся символов:.

Изменить: И далее по ключевым словам:

Ключевые слова напоминают символы, за исключением:
* Они могут и должны начинаться с двоеточия, например.: Фрэд
. * Они не могут содержать '.' или классы имен.
* Ключевое слово, начинающееся с двух двоеточий, разрешается в текущем пространстве имен

Ответ 3

Из этого списка читатель, безусловно, позволяет - и _, но/имеет особое значение как разделитель между пространствами имен и именами символов. Период (о котором вы не спрашивали) также проблематичен внутри имен символов, так как он используется в полностью квалифицированных именах классов Java.

Что касается idiom Clojure, - ваш лучший друг в именах символов. Он занимает место верблюжьего случая в Java или подчеркивание в Ruby.

Ответ 4

начиная с 1.3, вы можете использовать ' везде, где вы не начинаете ключевое слово. поэтому :arthur's-keyword разрешено:)

Я использую ключевые слова :-P и :-D для временного выделения моего кода (как синонимы для true и false)