P: Jak się tworzy i używa :keywords
?
Rozważ (naiwnie, najwyraźniej) próbę uzyskania dostępu do następującej listy zabawek:
(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
Pierwszy klucz działa zgodnie z oczekiwaniami, ale drugi klucz nie. O ile nie ma oczywistej make-keyword
funkcji, jak można utworzyć i użyć słowa kluczowego?
Oryginalna motywacja: muszę przekształcić ciąg znaków w klucz wyszukiwania, który jest symbolem, na którym mogę put
właściwości.
W trakcie formułowania tego pytania uzyskałem przynajmniej część odpowiedzi, którą zamieszczam osobno. Mam nadzieję, że jaśniejsze umysły niż moje mogą poprawić.
(eq :foo (read ":foo"))
Odpowiedzi:
Masz rację, że
make-symbol
utworzysz słowo kluczowe, które nieeq
jest żadnym z istniejących słów kluczowych, iintern
może zanieczyścić globalną obarray nowym symbolem. Pomiędzy nimi maszintern-soft
, który zwraca symbol, jeśli został już utworzony lubnil
jeśli nie:Powinno to być odpowiednie dla twojego celu: jeśli słowo kluczowe nie istnieje, nie może być obecne na liście, więc nie trzeba go tworzyć, aby sprawdzić, czy ono istnieje. Coś jak:
źródło
intern-soft
ale nie pomyślałem, aby użyć go w ten sposób.Być może nie rozumiem poprawnie pytania. Ale jeśli chcesz słowa kluczowego (czyli chcesz, aby zaspokoić
keywordp
), to chce być symbolem internowany w globalnej obarray ,obarray
.To musi być internowany tam do zaspokojenia
keywordp
, AFAICT, iC-h f keywordp
tak mówi.Tak więc odpowiedź na twoje pytanie, AFAICT, jest tylko do użycia
intern
.Wydaje mi się, że być może nie zadajesz prawdziwego pytania - wygląda na pytanie XY. Co naprawdę próbujesz zrobić? (Być może stanowią to osobne pytanie.)
[W odpowiedzi na twój komentarz, że internowanie „ nie jest
:keyword
specyficzne, ponieważ dotyczy wszystkich symboli ”: Prawidłowo, internowanie nie jest specyficzne dla słów kluczowych. Ale internowanie (inobarray
) i korzystanie zsymbol-name
rozpoczynającego się od:
jest specyficzne dla słów kluczowych.]źródło
Oto częściowa odpowiedź na to pytanie. Krótka i niezupełnie satysfakcjonująca wersja wygląda na: użyj
intern
.:key-1
spełnia zarówno:Wprawdzie
(make-symbol ":key-1")
spełnia pierwsze, ale nie drugie:Teraz dokumentacja dla
make-symbol
mówi, że:Mmmkay, a dokumentacja dla
keywordp
mówi, że:Wygląda więc na to, że
intern
zadziała:Ponieważ
intern
będzie:Nie wydaje się to jednak
:keyword
specyficzne, ponieważ dotyczy wszystkich symboli. Domyślnie wydaje się także, że zanieczyszcza globalnośćobarray
, co może, ale nie musi być wielkim problemem.źródło