1. ホーム
  2. lisp

[解決済み] なぜClojureには "シンボル "の他に "キーワード "があるのですか?

2022-06-28 23:20:06

質問

私は昔から他のLisp(特にScheme)について一応の知識を持っています。最近、私は Clojure . Clojureにはシンボルとキーワードがありますね。シンボルはよく知っていますが、キーワードは知りません。

他のLispsにもキーワードはあるのでしょうか?キーワードとシンボルとの違いは、表記方法(コロンなど)の違い以外にありますか?

どのように解決するのですか?

ここで Clojureのドキュメント のキーワードとシンボルに関するドキュメントです。

キーワードは、それ自身に対して評価される記号的な識別子です。これらは非常に高速な等値性テストを提供します...

シンボルは、通常、他の何かを参照するために使用される識別子です。関数パラメータ、letバインディング、クラス名、グローバルバーを参照するためにプログラムフォームで使用することができます...

キーワードは一般的に、ハッシュマップのキーやマルチメソッドのディスパッチ値など、軽量の定数文字列として使用されます。 シンボルは一般的に変数や関数の名前に使われ、マクロなどを除いてはオブジェクトとして直接操作することはあまりありません。 しかし、キーワードを使用するあらゆる場所でシンボルを使用することを妨げるものは何もありません(常に引用することを気にしないのであれば)。

この違いを理解する最も簡単な方法は、次のように読むことです。 Keyword.javaSymbol.java をClojureのソースに追加しました。 いくつかの明らかな実装の違いがあります。 例えば、Clojureのシンボルはメタデータを持つことができ、キーワードは持つことができません。

シングルコロン構文に加えて、ダブルコロンで名前空間修飾されたキーワードを作ることができます。

user> :foo
:foo
user> ::foo
:user/foo

Common LispにもRubyや他の言語と同様にキーワードがあります。 もちろん、それらの言語では若干の違いがあります。 Common LispのキーワードとClojureのキーワードの違いをいくつか紹介します。

  1. ClojureのキーワードはSymbolsではありません。

    user> (symbol? :foo)  
    false
    
    
  2. キーワードは、特に修飾しない限り、どの名前空間にも属しません。

    user> (namespace :foo)
    nil
    user> (namespace ::foo)
    "user"
    
    

(感謝 ライナー・ヨスヴィッヒ のおかげで、見るべきもののアイデアを得ることができました)。