有什么区别:foo,:: foo,:: bar/foo,以及:Clojure中的bar/foo?

Ert*_*tin 5 lisp functional-programming clojure clojurescript

我遇到了这些关键字: :foo, ::foo, ::bar/foo, and :bar/foo

你能解释一下与例子的区别吗?

Jos*_*osh 10

:foo是一个非完全限定的关键字.它没有与之关联的命名空间.

(name :foo)            ; => "foo"
(namespace :foo)       ; => nil
Run Code Online (Sandbox Code Playgroud)

:bar/foo是一个名称空间限定的关键字.命名空间是bar,关键字的名称是foo

(name :bar/foo)        ; => "foo"
(namespace :bar/foo)   ; => "bar"
Run Code Online (Sandbox Code Playgroud)

::foo将当前命名空间与关键字相关联,使其完全合格.假设当前名称空间是"user":

*ns*                   ; => #namespace[user]
(name ::foo)           ; => "foo"
(namespace ::foo)      ; => "user"
::foo                  ; => :user/foo
Run Code Online (Sandbox Code Playgroud)

::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
Run Code Online (Sandbox Code Playgroud)