2017-02-06 5 views
5

私はそれらのキーワードに遭遇しました::foo, ::foo, ::bar/foo, and :bar/fooClojureのfoo、:: foo、:: bar/foo、および:bar/fooの違いは何ですか?

例との違いを説明できますか?

+0

の名前空間キーワードを検索して見られる複数の場所でも説明されています。 https://clojuredocs.org/clojure.core/keywordとhttps://kotka.de/blog/2010/05/Did_you_know_III.htmlを参照してください。 – tar

答えて

10

:fooは非完全修飾キーワードです。これに関連付けられた名前空間はありません。

(name :foo)   ; => "foo" 
(namespace :foo)  ; => nil 

:bar/fooは、名前空間限定キーワードです。名前空間はbarで、キーワードの名前は、完全修飾作り、キーワードで現在の名前空間を関連付けますfoo

(name :bar/foo)  ; => "foo" 
(namespace :bar/foo) ; => "bar" 

::fooです。現在のネームスペースを想定すると、「ユーザー」である:

*ns*     ; => #namespace[user] 
(name ::foo)   ; => "foo" 
(namespace ::foo)  ; => "user" 
::foo     ; => :user/foo 

::bar/fooそれは完全修飾にするために任意のエイリアスを拡大しようとします。

(create-ns 'my.namespace)  ; => #namespace[my.namespace] 
(alias 'bar 'my.namespace)  ; => nil 
(name ::bar/foo)    ; => "foo" 
(namespace ::bar/foo)   ; => "my.namespace" 
::bar/foo      ; => :my.namespace/foo 
3

This articleはよく説明しています。

TL; DR:

  • :fooは、名前空間なしのキーワード、すなわち非修飾キーワードです。
  • :foo/barは、明示的な名前空間で修飾fooキーワードです。
  • ::fooは自動的に修飾されたキーワードです。このキーワードが名前空間bar内で発生する場合は、:bar/fooと評価されます。名前空間bar :as bazが必要な場合
  • ::bar/fooの名前空間が:baz/fooと同じです。コードで

boot.user=> (ns foo) 
nil 
foo=> (ns bar (:require [foo :as f])) 
nil 
bar=> (def examples [:foo ::foo ::f/foo :bar/foo]) 
#'bar/examples 
bar=> examples 
[:foo :bar/foo :foo/foo :bar/foo] 
bar=> (use 'clojure.pprint) 
nil 
bar=> (print-table (map (fn [example] 
          {:key example :namespace (namespace example) 
          :name (name example)}) 
        examples)) 

|  :key | :namespace | :name | 
|----------+------------+-------| 
|  :foo |   | foo | 
| :bar/foo |  bar | foo | 
| :foo/foo |  foo | foo | 
| :bar/foo |  bar | foo | 
関連する問題