我正在看一下优秀的Clojure教程here。在其中一个例子中,它的Clojure代码如下:
(def vowel? (set "aeiou"))
这使元音的元音返回true,辅音返回false:
(vowel? (first "abc")) ; => true
(vowel? (first "cba")) ; => false
这是为什么?我假设它与变量名后面的问号有关。在教程中找不到任何东西...
编辑我刚刚意识到vowel?
不会返回true或false,而是返回元素本身或nil。看看我自己的答案。
答案 0 :(得分:16)
这完全类似于地图(Clojure中最自然的对象)的工作方式。当地图作为函数调用时,它可用作映射:
user=> (def ob {:foo "bar", :bar :baz, :qwerty 42})
#'user/ob
user=> (ob :foo)
"bar"
因此,将Clojure集合作为函数调用是有道理的,并且可以作为成员资格测试。顺便说一句,如果你使用关键字(那些以冒号开头的东西)作为映射的键,它们也可以作为类似的函数使用,所以你可以这样做
user=> (:bar ob)
:baz
甚至与关键字组相同:
user=> (def vowel-keywords (set [:a :e :i :o :u]))
#'user/vowel-keywords
user=> (:a vowel-keywords)
:a
user=> (:b vowel-keywords)
nil
但是,再一次,后一种技巧只适用于关键字,而不是你可能用作映射中的键或集合中的成员的任何其他技巧。
答案 1 :(得分:7)
啊哈!我最终找到了自己。它实际上并不返回true
或false
,而是返回集合中的第一个匹配项,如果没有则返回nil。
因为你可以将它作为条件使用(nil被处理为false,非nil为true),这可以作为检查字符串是否包含字母的一个很好的小黑客。
(vowel? (first "abc")) ; => "a"
(vowel? (first "cba")) ; => nil
(if (vowel? (first "abc"))
(println "yay")
(println "oops")) ; => "yay"