F: Wie erstellt und verwendet man :keywords
?
Betrachten Sie einen (naiven, anscheinend) Versuch, auf die folgende Spielzeugliste zuzugreifen:
(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
Der erste Schlüssel funktioniert wie erwartet, der zweite Schlüssel jedoch nicht. make-keyword
Wie erstellt und verwendet man ein Schlüsselwort, sofern es keine offensichtliche Funktion gibt?
Ursprüngliche Motivation: Ich muss eine Zeichenfolge in einen Suchschlüssel umwandeln, der ein Symbol ist, auf das ich put
Eigenschaften anwenden kann .
Bei der Formulierung dieser Frage habe ich zumindest einen Teil der Antwort erhalten, die ich separat veröffentliche. Ich hoffe, dass ein besserer Verstand als meiner es verbessern kann.
(eq :foo (read ":foo"))
Antworten:
Sie haben Recht, dass
make-symbol
ein Keyword erstellt wirdeq
, das keinem vorhandenen Keyword entspricht, undintern
möglicherweise das globale Objekt mit dem neuen Symbol verunreinigt. Dazwischen haben Sieintern-soft
, was das Symbol zurückgibt, wenn es bereits erstellt wurde odernil
nicht:Dies sollte für Ihren Zweck geeignet sein: Wenn das Schlüsselwort nicht vorhanden ist, kann es nicht in der Alist vorhanden sein, sodass es nicht erstellt werden muss, um zu überprüfen, ob es vorhanden ist. Etwas wie:
quelle
intern-soft
aber nicht daran gedacht, es so zu benutzen.Vielleicht verstehe ich die Frage nicht richtig. Wenn Sie jedoch ein Schlüsselwort möchten (dh, Sie möchten erfüllen
keywordp
), möchten Sie, dass das Symbol im globalen obarray interniert wirdobarray
.Es muss dort interniert werden, um zu befriedigen
keywordp
, AFAICT, undC-h f keywordp
sagt es auch.Die Antwort auf Ihre Frage, AFAICT, ist also nur zu verwenden
intern
.Ich habe das Gefühl, dass Sie Ihre eigentliche Frage vielleicht nicht stellen - scheint eine XY-Frage zu sein. Was versuchst du wirklich zu tun? (Vielleicht stellen Sie das als separate Frage.)
[Als Antwort auf Ihre Bemerkung, dass Internierung " nicht
:keyword
spezifisch ist, da sie für alle Symbole gilt ": Richtig, Internierung ist nicht spezifisch für Schlüsselwörter. Internieren (inobarray
) und Verwenden von asymbol-name
, das mit "" beginnt,:
ist jedoch spezifisch für Schlüsselwörter.]quelle
Hier ist eine teilweise Antwort auf diese Frage. Die kurze und nicht ganz befriedigende Version scheint zu sein: use
intern
.:key-1
befriedigt beide:Während
(make-symbol ":key-1")
erfüllt die erste, aber nicht die zweite:Nun, die Docstring für
make-symbol
sagt, dass es wird:Mmmkay, und der Docstring für
keywordp
sagt, dass es wird:So scheint es, dass
intern
es funktionieren wird:Denn
intern
wird:Dies scheint jedoch nicht
:keyword
spezifisch zu sein, da es für alle Symbole gilt. Standardmäßig scheint es auch die globale Umwelt zu verschmutzenobarray
, was eine große Sache sein kann oder nicht.quelle