Clojure,为什么键和值都在使用":"?

时间:2015-02-13 06:59:13

标签: clojure

(defn explain-defcon-level [exercise-term]
  (case exercise-term
        :fade-out          :you-and-what-army
        :double-take       :call-me-when-its-important
        :round-house       :o-rly
        :fast-pace         :thats-pretty-bad
        :cocked-pistol     :sirens
        :say-what?))

如果我理解正确,通常键有冒号而值却没有。 这里的目的是什么? 感谢。

3 个答案:

答案 0 :(得分:3)

:开头的字词是关键字。关键字在某些语言中充当已知值,如枚举。您也可以像在Python或JavaScript中那样使用字符串,但关键字具有一些不错的功能。

在这种情况下,如果函数接收到例如已知关键字:round-house,它将返回已知值:o-rly。其他一些代码反过来知道:o-rly的含义。如果调用explain-defcon-level的代码希望它返回字符串,你也可以使用字符串。

关键字:

  • 可以在地图(def m {:abba 1 :beef 2}) .. (:abba m) => 1
  • 中查找自己
  • 很容易将(name :foo) => "foo"
  • 字符串化
  • 很容易从字符串(keyword "bar") => :bar
  • 制作
  • 高效:快速比较,不浪费记忆

答案 1 :(得分:2)

:只需reader form即可创建keywords

clojure中的

Keywords是数据结构,就像符号,字符串或数字一样。

关键字在hashmaps中用作键,因为它们为invoke()实现IFn,允许您编写(:mykey my-map)而不是(my-map :mykey)(get my-map :mykey)之类的内容。

通常,您可以将任何数据结构用作hashmap键:

(def my-map
  { {:foo :bar} 1
    {:bar :baz} 2 })

(my-map {:foo :bar}) ; 1

答案 2 :(得分:0)

您可以将clojure代码视为由s表达式中的许多符号组成。当阅读器解析这些表达式时,它必须将符号解析为值。其中一些符号是自我评估的,即他们将自己评估。例如,符号“Hello world”是一个字符串符号,它对自身进行求值。数字123也是自我评估的,将评估为123.

其他符号需要绑定到某个值。如果你只有符号fred,它需要绑定到某个值,即(def fred“Hello world”)。如果符号是列表中的第一个符号(s-expression),它必须求值为一个函数,即(def fred(fn ....)或简写(defn fred [] ....)。注意,这是稍微简化一下,因为你也有宏,但是现在可以忽略它们 - 它们很特别,实际上通常被称为特殊形式。

除了字符串和数字之外,还有另一个非常有用的自我评估符号,即关键字。它以前导':'为特色。关键词评估自己,即:fred评估为:fred。

关键字还具有一些非常好的属性,例如快速比较和有效利用空间。当你想要一个代表某个东西的符号但又不想在你使用之前定义(绑定)它的东西时,它们也很有用。在哈希映射中,关键字也是哈希映射的函数,因此您可以执行(:mykey maymap)而不是(get mymay:mykey)。

通常,每个符号必须求值为一个值,非带引号列表中的第一个符号必须求值为一个函数。您可以引用列表和符号,这些列表和符号基本上表示“此时不评估我”。

考虑到这一点,你可以使用任何这些符号作为clojure数据结构中的值,即你可以有函数,关键字,字符串,数字等的向量。

在您提供的示例中,您希望您的case语句返回某种符号,然后您可以使用该符号在程序中稍后做出决定。您可以将返回值定义为字符串,例如“您和他的军队”,然后将其与其他字符串进行比较以做出决定。但是,您甚至可以通过定义类似

的绑定来使事情更加健壮
(def a "You and whose army")

然后做

之类的事情
(= a return-val)

但它并没有真正为你买任何东西。它需要更多的输入,引用,内存,并且比较慢。

当您只是在repl上玩游戏并且想要测试一些想法时,关键字通常非常有用。你不必写像[“a”“b”“cc”]这样的东西,你可以写[:a:b:c]。