(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?))
如果我理解正确,通常键有冒号而值却没有。 这里的目的是什么? 感谢。
答案 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。
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]。