T: Bagaimana cara membuat dan menggunakan :keywords
?
Pertimbangkan upaya (naif, tampaknya) untuk mengakses daftar mainan berikut:
(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
Kunci pertama berfungsi seperti yang diharapkan, tetapi kunci kedua tidak. Sejauh tidak ada make-keyword
fungsi yang jelas , bagaimana cara membuat dan menggunakan kata kunci?
Motivasi orisinal: Saya perlu mengubah string menjadi kunci pencarian yang merupakan simbol yang saya dapat put
properti.
Dalam proses merumuskan pertanyaan ini, saya mendapatkan setidaknya sebagian dari jawaban, yang saya posting secara terpisah. Saya berharap pikiran yang lebih cerah daripada yang bisa saya perbaiki.
(eq :foo (read ":foo"))
Jawaban:
Anda benar yang
make-symbol
akan membuat kata kunci yang bukaneq
untuk kata kunci yang ada, danintern
mungkin mencemari obarray global dengan simbol baru. Di antara itu, Anda memilikiintern-soft
, yang mengembalikan simbol jika sudah dibuat, ataunil
jika belum:Ini harus sesuai untuk tujuan Anda: jika kata kunci tidak ada, kata kunci itu tidak ada di daftar, jadi tidak perlu membuatnya hanya untuk memeriksa apakah ada di sana. Sesuatu seperti:
sumber
intern-soft
tetapi tidak berpikir untuk menggunakannya dengan cara ini.Mungkin saya tidak memahami pertanyaan dengan benar. Tetapi jika Anda ingin kata kunci (yaitu, Anda ingin memuaskan
keywordp
) maka Anda ingin simbol yang akan magang di obarray global yang ,obarray
.Itu harus diinternir di sana untuk memuaskan
keywordp
, AFAICT, danC-h f keywordp
mengatakan demikian.Jadi jawaban untuk pertanyaan Anda, AFAICT, hanya digunakan
intern
.Saya merasa Anda mungkin tidak menanyakan pertanyaan Anda yang sebenarnya - sepertinya pertanyaan XY. Apa yang sebenarnya ingin Anda lakukan? (Mungkin mengajukan itu sebagai pertanyaan terpisah.)
[Sebagai jawaban atas komentar Anda bahwa pemagangan " tidak
:keyword
spesifik, karena berlaku untuk semua simbol ": Benar, pemagangan tidak spesifik untuk kata kunci. Tetapi magang (obarray
menggunakan) dan menggunakansymbol-name
yang dimulai:
khusus untuk kata kunci.]sumber
Ini jawaban parsial untuk pertanyaan ini. Versi singkat dan tidak sepenuhnya memuaskan tampaknya: digunakan
intern
.:key-1
memenuhi keduanya:Meskipun
(make-symbol ":key-1")
memuaskan yang pertama tetapi tidak yang kedua:Sekarang, dokumen untuk
make-symbol
mengatakan bahwa itu akan:Mmmkay, dan dokumen untuk
keywordp
mengatakan bahwa itu akan:Jadi tampaknya itu
intern
akan berfungsi:Karena
intern
akan:Tapi ini sepertinya tidak
:keyword
spesifik, karena ini berlaku untuk semua simbol. Secara default, tampaknya juga mencemari globalobarray
, yang mungkin atau mungkin bukan A Big Deal.sumber