【问题标题】:What is the difference between :foo, ::foo, ::bar/foo, and :bar/foo in Clojure?Clojure 中的 :foo、::foo、::bar/foo 和 :bar/foo 有什么区别?
【发布时间】:2017-06-23 13:35:47
【问题描述】:

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

你能用例子解释一下不同之处吗?

【问题讨论】:

标签: clojure functional-programming lisp clojurescript


【解决方案1】:

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 |

【讨论】:

    【解决方案2】:

    :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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多