Q: Comment crée-t-on et utilise- :keywords
t-on?
Envisagez une tentative (naïve, apparemment) d'accéder à la liste de jouets suivante:
(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
La première clé fonctionne comme prévu, mais pas la deuxième clé. Dans la mesure où il n'y a pas de make-keyword
fonction évidente , comment créer et utiliser un mot-clé?
Motivation d'origine: j'ai besoin de transformer une chaîne en une clé de recherche qui est un symbole sur lequel je peux put
propriétés.
Dans le processus de formulation de cette question, j'ai obtenu au moins une partie de la réponse, que je poste séparément. J'espère que des esprits plus brillants que le mien pourront l'améliorer.
(eq :foo (read ":foo"))
Réponses:
Vous avez raison de
make-symbol
créer un mot-clé qui ne correspondeq
à aucun mot-clé existant etintern
pourrait polluer l'obarray global avec le nouveau symbole. Entre ceux-ci, vous avezintern-soft
, qui renvoie le symbole s'il a déjà été créé, ounil
s'il n'a pas:Cela devrait convenir à votre objectif: si le mot-clé n'existe pas, il ne peut pas être présent dans la liste, il n'est donc pas nécessaire de le créer juste pour vérifier s'il est là. Quelque chose comme:
la source
intern-soft
mais je n'avais pas pensé à l'utiliser de cette façon.Je ne comprends peut-être pas la question correctement. Mais si vous voulez un mot - clé ( par exemple, vous voulez satisfaire
keywordp
), vous voulez que le symbole à interné dans le obarray mondial ,obarray
.Il doit y être interné pour satisfaire
keywordp
, AFAICT, et leC-h f keywordp
dit.Donc, la réponse à votre question, AFAICT, est juste à utiliser
intern
.J'ai l'impression que vous ne posez peut-être pas votre vraie question - semble être une question XY. Qu'essayez-vous vraiment de faire? (Peut-être poser cela comme une question distincte.)
[En réponse à votre commentaire selon lequel l'internement " n'est pas
:keyword
spécifique, car il s'applique à tous les symboles ": Correct, l'internement n'est pas spécifique aux mots clés. Mais l'internement (enobarray
) et l'utilisation d'unsymbol-name
qui commence par:
est spécifique aux mots clés.]la source
Voici une réponse partielle à cette question. La version courte et pas entièrement satisfaisante semble être: utiliser
intern
.:key-1
satisfait à la fois:Tout en
(make-symbol ":key-1")
satisfaisant le premier mais pas le second:Maintenant, le docstring pour
make-symbol
dit qu'il va:Mmmkay, et le docstring pour
keywordp
dit qu'il va:Il semble donc que
intern
cela fonctionnera:Parce
intern
que:Mais cela ne semble pas être
:keyword
spécifique, car cela s'applique à tous les symboles. Par défaut, il semble également polluer le mondeobarray
, qui peut ou non être une grosse affaire.la source