У меня есть кое-какие знания о других Lisp (особенно о Scheme) с давних времен. Недавно я читал о Clojure . Я вижу, что в нем есть и «символы», и «ключевые слова». Знакомые символы, но не ключевые слова.
Есть ли у других Лиспов ключевые слова? Чем ключевые слова отличаются от символов, если они не имеют другого обозначения (например, двоеточия)?
Ответы:
Вот документация Clojure по ключевым словам и символам.
Ключевые слова обычно используются как легкие «постоянные строки», например, для ключей хэш-карты или значений диспетчеризации мультиметода. Символы обычно используются для именования переменных и функций, и реже манипулируют ими как объектами напрямую, за исключением макросов и т.п. Но ничто не мешает вам использовать символ везде, где вы используете ключевое слово (если вы не против постоянно их цитировать).
Самый простой способ , чтобы увидеть разницу, чтобы прочитать
Keyword.java
иSymbol.java
в источнике Clojure. Есть несколько очевидных различий в реализации. Например, у символа в Clojure могут быть метаданные, а у ключевого слова - нет.Помимо синтаксиса с одним двоеточием, вы можете использовать двойное двоеточие для создания ключевого слова с указанием пространства имен.
В Common Lisp есть ключевые слова, как в Ruby и других языках. Конечно, на этих языках они немного отличаются. Некоторые различия между ключевыми словами Common Lisp и Clojure:
Ключевые слова в Clojure не являются символами.
Ключевые слова не принадлежат ни к какому пространству имен, если вы специально не указали их:
(Спасибо Райнеру Йосвигу за то, что он дал мне идеи, на что можно посмотреть.)
источник
(eval (eval ':a))
против(eval (eval ''a))
. Есть ли другие преимущества? По производительности они идентичны?В Common Lisp есть ключевые слова.
Ключевые слова - это тоже символы.
Что делает ключевые слова особенными:
В противном случае ключевые слова представляют собой обычные символы. Таким образом, ключевые слова могут называть функции или иметь списки свойств.
Помните: в Common Lisp символы принадлежат пакету. Это можно записать так:
Для символов ключевого слова это означает, что: foo, keyword: foo и keyword :: foo - это один и тот же символ. Таким образом, два последних обозначения обычно не используются.
Итак: foo просто анализируется как входящий в пакет KEYWORD, предполагая, что указание имени пакета перед именем символа означает по умолчанию пакет KEYWORD.
источник
Ключевые слова - это символы, которые оценивают сами себя, поэтому вам не нужно помнить их цитировать.
источник
Ключевые слова: также обрабатываются многими коллекциями особым образом, что позволяет использовать действительно удобный синтаксис.
такой же как
это делает вещи немного более гибкими
источник
Для ключевых слов хеш-значения вычисляются и кэшируются при первом создании ключевого слова. При поиске ключевого слова как хеш-ключа оно просто возвращает предварительно вычисленное хешированное значение. Для строк и символов хэш пересчитывается при каждом поиске.
Почему ключевые слова с одинаковыми именами всегда идентичны, они содержат свои собственные хеш-значения. Поскольку поиск в картах и наборах осуществляется с помощью хэш-ключей, это способствует повышению эффективности поиска в случае многочисленных поисков, а не в самом поиске.
источник
Ключевые слова глобальны , символы - нет .
Этот пример написан на JavaScript, но я надеюсь, что он поможет донести мысль.
Когда вы создаете символ с помощью
Symbol
функции, вы каждый раз получаете отдельный / частный символ. Когда вы запрашиваете символ черезSymbol.for
функцию, вы каждый раз будете возвращать тот же символ.Все они одинаковы.
Имена аргументов функции являются локальными. т.е. не ключевые слова.
источник