Clojure,为什么键和值都使用“:”?
Clojure, why both key and values are using ":"?
(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?))
如果我没理解错的话,通常key有冒号而value没有。
这里的目的是什么?
谢谢
以:
开头的词是关键字。关键字在某些语言中充当已知值,如枚举。您也可以像在 Python 或 JavaScript 中那样使用字符串,但关键字有一些不错的功能。
在这种情况下,如果函数接收到例如已知关键字 :round-house
,它将 return 已知值 :o-rly
。其他一些代码反过来知道 :o-rly
的含义。如果调用 explain-defcon-level
的代码期望它是 return 个字符串,那么您也可以使用字符串。
关键词:
- 可以在地图上查找自己
(def m {:abba 1 :beef 2}) .. (:abba m) => 1
- 易于字符串化
(name :foo) => "foo"
- 很容易用字符串制作
(keyword "bar") => :bar
- 性能好:比较快,不浪费内存
:
只是一个 reader form for creating keywords.
Keywords 在 clojure 中是数据结构,就像符号、字符串或数字一样。
关键字在 hashmaps 中用作键,因为它们为 invoke() 实现了 IFn,允许您编写类似 (:mykey my-map)
的内容,而不是 (my-map :mykey)
或 (get my-map :mykey)
。
通常,您可以使用任何数据结构作为哈希映射键:
(def my-map
{ {:foo :bar} 1
{:bar :baz} 2 })
(my-map {:foo :bar}) ; 1
您可以将 clojure 代码视为由许多 s 表达式中的符号组成。当 reader 解析这些表达式时,它必须将符号解析为一个值。其中一些符号是自我评估的,即它们将对自己进行评估。例如,符号 "Hello world" 是一个字符串符号,其计算结果为自身。数字 123 也在自我评估,并将评估为数字 123。
其他符号需要绑定一个值。如果你只有符号 fred,它需要绑定到某个值,即 (def fred "Hello world")。如果该符号是列表(s 表达式)中的第一个符号,则它必须计算为一个函数,即 (def fred (fn ....) 或 shorthand (defn fred [] ....)。请注意,这稍微简化了一些事情,因为您也有宏,但现在可以忽略它们 - 它们很特殊,实际上通常被称为特殊形式。
除了字符串和数字,还有一个非常有用的自评符号,关键字。它以领先的“:”来区分。关键字对自己进行评估,即 :fred 评估为 :fred。
关键字还有一些非常好的特性,比如比较快,使用效率高space。当您想要一个代表某物的符号,但不想在使用它之前必须将其定义(绑定)到某物时,它们也很有用。在散列映射中,关键字也是散列映射的函数,因此您可以执行类似 (:mykey maymap) 而不是 (get mymay :mykey) 的操作。
一般来说,每个符号都必须计算为一个值,非引用列表中的第一个符号必须计算为一个函数。您可以引用列表和符号,这实际上表示 "don't evaluate me at this point"。
考虑到这一点,您可以将这些符号中的任何一个用作 clojure 数据结构中的值,即您可以拥有函数向量、关键字、字符串、数字等。
在您提供的示例中,您希望您的 case 语句 return 某种符号,然后您可能会使用它来稍后在您的程序中做出某些决定。您可以将 return 值定义为字符串,例如 "You and whose army",然后将其与其他字符串进行比较以做出决定。但是,您甚至可以通过定义像
这样的绑定来使事情变得更加健壮
(def a "You and whose army")
然后做类似
的事情
(= a return-val)
但这并不能真正给你买任何东西。它需要更多的打字、引用、记忆并且比较慢。
当您只是在 repl 上玩耍并且只想测试一些想法时,关键字通常非常有用。不必写 ["a" "b" "cc"] 之类的东西,你可以只写 [:a :b :c]。
(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?))
如果我没理解错的话,通常key有冒号而value没有。 这里的目的是什么? 谢谢
以:
开头的词是关键字。关键字在某些语言中充当已知值,如枚举。您也可以像在 Python 或 JavaScript 中那样使用字符串,但关键字有一些不错的功能。
在这种情况下,如果函数接收到例如已知关键字 :round-house
,它将 return 已知值 :o-rly
。其他一些代码反过来知道 :o-rly
的含义。如果调用 explain-defcon-level
的代码期望它是 return 个字符串,那么您也可以使用字符串。
关键词:
- 可以在地图上查找自己
(def m {:abba 1 :beef 2}) .. (:abba m) => 1
- 易于字符串化
(name :foo) => "foo"
- 很容易用字符串制作
(keyword "bar") => :bar
- 性能好:比较快,不浪费内存
:
只是一个 reader form for creating keywords.
Keywords 在 clojure 中是数据结构,就像符号、字符串或数字一样。
关键字在 hashmaps 中用作键,因为它们为 invoke() 实现了 IFn,允许您编写类似 (:mykey my-map)
的内容,而不是 (my-map :mykey)
或 (get my-map :mykey)
。
通常,您可以使用任何数据结构作为哈希映射键:
(def my-map
{ {:foo :bar} 1
{:bar :baz} 2 })
(my-map {:foo :bar}) ; 1
您可以将 clojure 代码视为由许多 s 表达式中的符号组成。当 reader 解析这些表达式时,它必须将符号解析为一个值。其中一些符号是自我评估的,即它们将对自己进行评估。例如,符号 "Hello world" 是一个字符串符号,其计算结果为自身。数字 123 也在自我评估,并将评估为数字 123。
其他符号需要绑定一个值。如果你只有符号 fred,它需要绑定到某个值,即 (def fred "Hello world")。如果该符号是列表(s 表达式)中的第一个符号,则它必须计算为一个函数,即 (def fred (fn ....) 或 shorthand (defn fred [] ....)。请注意,这稍微简化了一些事情,因为您也有宏,但现在可以忽略它们 - 它们很特殊,实际上通常被称为特殊形式。
除了字符串和数字,还有一个非常有用的自评符号,关键字。它以领先的“:”来区分。关键字对自己进行评估,即 :fred 评估为 :fred。
关键字还有一些非常好的特性,比如比较快,使用效率高space。当您想要一个代表某物的符号,但不想在使用它之前必须将其定义(绑定)到某物时,它们也很有用。在散列映射中,关键字也是散列映射的函数,因此您可以执行类似 (:mykey maymap) 而不是 (get mymay :mykey) 的操作。
一般来说,每个符号都必须计算为一个值,非引用列表中的第一个符号必须计算为一个函数。您可以引用列表和符号,这实际上表示 "don't evaluate me at this point"。
考虑到这一点,您可以将这些符号中的任何一个用作 clojure 数据结构中的值,即您可以拥有函数向量、关键字、字符串、数字等。
在您提供的示例中,您希望您的 case 语句 return 某种符号,然后您可能会使用它来稍后在您的程序中做出某些决定。您可以将 return 值定义为字符串,例如 "You and whose army",然后将其与其他字符串进行比较以做出决定。但是,您甚至可以通过定义像
这样的绑定来使事情变得更加健壮(def a "You and whose army")
然后做类似
的事情(= a return-val)
但这并不能真正给你买任何东西。它需要更多的打字、引用、记忆并且比较慢。
当您只是在 repl 上玩耍并且只想测试一些想法时,关键字通常非常有用。不必写 ["a" "b" "cc"] 之类的东西,你可以只写 [:a :b :c]。