キーワードの作成方法は?


16

Q:どのように作成して使用し:keywordsますか?

次のおもちゃリストにアクセスしようとする(単純な、明らかに)試みを検討してください。

(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

最初のキーは期待どおりに機能しますが、2番目のキーは機能しません。明らかなmake-keyword機能がない限り、どのようにキーワードを作成して使用しますか?

当初の動機:文字列を、putプロパティであるシンボルであるルックアップキーに変換する必要があります。

この質問を定式化する過程で、回答の少なくとも一部に到達しました。これは個別に投稿しています。私は私の心がそれを改善することができるより明るい心を願っています。


1
(eq :foo (read ":foo"))
abo-abo

回答:


9

あなたは正しいことをしているmake-symbolではありませんキーワードが作成されますeq任意の既存のキーワードにして、intern新しいシンボルを持つグローバルオブジェクト配列を汚染することがあります。それらの間に、がintern-softあります。すでに作成されているnil場合、または作成されていない場合は、シンボルを返します。

ELISP> (intern-soft ":key-1")
nil
ELISP> :key-1
:key-1
ELISP> (intern-soft ":key-1")
:key-1

これはあなたの目的に適しているはずです。キーワードが存在しない場合、リストに存在することはできないため、キーワードが存在するかどうかを確認するためだけに作成する必要はありません。何かのようなもの:

(let ((maybe-keyword (intern-soft ":key-1")))
  (and maybe-keyword (assq maybe-keyword alist)))

賢い-私は見intern-softたことがありますが、このように使うとは考えていませんでした。
ダン

6

質問を正しく理解していないのかもしれません。あなたがいる場合でも、キーワードをしたい(つまり、あなたが満足するために必要keywordp)、その後、あなたはシンボルはグローバルオブジェクト配列にインターンしたいですobarray

これは、必要があります満たすためにそこに抑留されkeywordp、AFAICT、とC-h f keywordpそう言います。

あなたの質問に対する答えは、AFAICTを使用することinternです。

あなたはおそらくあなたの本当の質問をしていないように感じます-XY質問のようです。あなたは本当に何をしようとしているのですか?(たぶん、それを別の質問として提示します。)

[インターンする「というコメントへの答えではないが:keyword、それはすべてのシンボルに適用されるように、特定の」:正しいインターン、キーワードに固有ではありません。ただし、インターン(obarray)およびsymbol-nameで始まるaの使用は:キーワード固有です。]


それは私がYにしようとしているという意味でXY質問です他の人にも役立ちます。
ダン

すごい。それは役に立ちます。THX。
ドリュー

2

この質問に対する部分的な回答を次に示します。短く、完全に満足できるバージョンは、useのようinternです。

:key-1 両方を満たす:

(symbolp :key-1)                    ; => t
(keywordp :key-1)                   ; => t

一方(make-symbol ":key-1")、2番目ではなく1番目を満たします:

(symbolp (make-symbol ":key-1"))    ; => t
(keywordp (make-symbol ":key-1"))   ; => nil

現在、のdocstringはmake-symbol次のようになります:

名前がNAMEである、新しく割り当てられたインターンされていないシンボルを返します。

Mmmkay、およびのdocstringは、keywordp次のようになります:

tOBJECTがキーワードの場合に戻ります。これは: 、最初のオブジェクト配列にインターンで始まる印刷名を持つシンボルであることを意味します。

したがって、動作するようですintern

(assq (intern ":key-1") alist)      ; => (:key-1 "Key no. 1")

なぜならintern

名前がSTRINGの正規記号を返します。存在しない場合は、この関数によって作成されて返されます。2番目のオプションの引数は、使用するobarrayを指定します。デフォルトはの値ですobarray

しかし、これは:keywordすべてのシンボルに適用されるため、具体的ではないようです。デフォルトでは、グローバルを汚染しているようにも見えますが、これは大したobarrayことではないかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.