Q: Как создать и использовать :keywords
?
Рассмотрим (наивно, по-видимому) попытку доступа к следующему списку игрушек:
(setf alist '((:key-1 "Key no. 1")
(:key-2 "Key no. 2")))
(assq :key-1 alist) ; => (:key-1 "Key no. 1")
(assq (make-symbol ":key-1") alist) ; => nil
Первый ключ работает как положено, а второй - нет. Поскольку нет очевидной make-keyword
функции, как можно создать и использовать ключевое слово?
Первоначальная мотивация: мне нужно преобразовать строку в ключ поиска, который является символом, для которого я могу put
свойства.
В процессе формулирования этого вопроса я получил хотя бы часть ответа, который я публикую отдельно. Я надеюсь, что более яркие умы, чем мои, могут улучшить это.
(eq :foo (read ":foo"))
Ответы:
Вы правы, что
make-symbol
создадите ключевое слово, которое не относитсяeq
к какому-либо существующему ключевому слову, иintern
может загрязнить глобальное пространство новым символом. Между ними у вас естьintern-soft
, который возвращает символ, если он уже был создан, илиnil
если он не был:Это должно подходить для вашей цели: если ключевое слово не существует, оно не может присутствовать в alist, поэтому нет необходимости создавать его просто для проверки его наличия. Что-то вроде:
источник
intern-soft
но не думал использовать это таким образом.Возможно, я не правильно понимаю вопрос. Но если вы хотите ключевое слово (то есть, вы хотите удовлетворить
keywordp
) , то вы хотите , чтобы символ интернирован в глобальной obarray ,obarray
.Это должно быть интернировано там, чтобы удовлетворить
keywordp
, AFAICT, иC-h f keywordp
так говорит.Таким образом, ответ на ваш вопрос, AFAICT, просто использовать
intern
.Я чувствую, что вы, возможно, не задаете свой настоящий вопрос - кажется, вопрос XY. Что ты на самом деле пытаешься сделать? (Возможно поставьте это как отдельный вопрос.)
[В ответ на ваш комментарий, что интернирование « не является
:keyword
специфическим, поскольку оно применяется ко всем символам »: правильно, интернирование не является специфическим для ключевых слов. Но интернирование (вobarray
) и использование,symbol-name
которое начинается с:
, специфично для ключевых слов.]источник
Вот частичный ответ на этот вопрос. Короткая и не совсем удовлетворительная версия выглядит так: use
intern
.:key-1
удовлетворяет как:Пока
(make-symbol ":key-1")
удовлетворяет первое, но не второеТеперь, строка документации
make-symbol
говорит, что это будет:Mmmkay, и документация для
keywordp
говорит, что это будет:Похоже, что
intern
будет работать:Потому что
intern
будет:Но это не кажется
:keyword
конкретным, поскольку это относится ко всем символам. По умолчанию, это также, кажется, загрязняет глобальныйobarray
, который может или не может быть Большой Курс.источник