P: Como alguém cria e usa :keywords
?
Considere uma tentativa (ingênua, aparentemente) de acessar o seguinte lista de brinquedos:
(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
A primeira chave funciona conforme o esperado, mas a segunda chave não. Na medida em que não existe uma make-keyword
função óbvia , como alguém cria e usa uma palavra-chave?
Motivação original: preciso transformar uma string em uma chave de pesquisa que seja um símbolo no qual eu possa put
propriedades.
No processo de formular esta pergunta, recebi pelo menos parte da resposta, que estou publicando separadamente. Espero que mentes mais brilhantes que as minhas possam melhorar isso.
(eq :foo (read ":foo"))
Respostas:
Você está certo ao
make-symbol
criar uma palavra-chave que não pertenceeq
a nenhuma palavra-chave existente eintern
pode poluir a matriz global com o novo símbolo. Entre eles, você temintern-soft
, que retorna o símbolo se ele já foi criado ounil
se não:Isso deve ser adequado ao seu objetivo: se a palavra-chave não existir, ela não poderá estar presente na lista, portanto, não será necessário criá-la apenas para verificar se ela existe. Algo como:
fonte
intern-soft
mas não tinha pensado em usá-lo dessa maneira.Talvez eu não esteja entendendo a pergunta corretamente. Mas se você quer uma palavra-chave (ou seja, você quer para satisfazer
keywordp
), então você quer que o símbolo a ser internado no obarray mundial ,obarray
.Ele deve ser internado lá para satisfazer
keywordp
, AFAICT, eC-h f keywordp
diz isso.Portanto, a resposta para sua pergunta, AFAICT, é apenas para usar
intern
.Sinto que você talvez não esteja fazendo sua pergunta real - parece uma pergunta XY. O que você realmente está tentando fazer? (Talvez faça isso como uma pergunta separada.)
[Em resposta ao seu comentário, a internação " não é
:keyword
específica, pois se aplica a todos os símbolos ": correta, a internação não é específica de palavras-chave. Mas inserir (inobarray
) e usar umsymbol-name
que comece com:
é específico para palavras-chave.]fonte
Aqui está uma resposta parcial a esta pergunta. A versão curta e não totalmente satisfatória parece ser: use
intern
.:key-1
satisfaz ambos:Embora
(make-symbol ":key-1")
satisfaça o primeiro, mas não o segundo:Agora, a doutrina para
make-symbol
diz que irá:Mmmkay, e a doutrina para
keywordp
diz que irá:Então parece que
intern
vai funcionar:Porque
intern
irá:Mas isso não parece ser
:keyword
específico, pois se aplica a todos os símbolos. Por padrão, ele também parece poluir o globalobarray
, que pode ou não ser um grande negócio.fonte