Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure “为什么?”;(def元音?(set";aeiou";)";工作_Clojure - Fatal编程技术网

Clojure “为什么?”;(def元音?(set";aeiou";)";工作

Clojure “为什么?”;(def元音?(set";aeiou";)";工作,clojure,Clojure,我正在看优秀的Clojure教程。在其中一个示例中,Clojure代码如下所示: (def vowel? (set "aeiou")) 这使得元音返回为真,辅音返回为假: (vowel? (first "abc")) ; => true (vowel? (first "cba")) ; => false 为什么会这样?我假设它与变量名后面的问号有关。在教程中无法立即找到任何内容 Edit我刚刚意识到元音?不会返回true或false,而是返回元素本身或nil。看看我自己的答案。

我正在看优秀的Clojure教程。在其中一个示例中,Clojure代码如下所示:

(def vowel? (set "aeiou"))
这使得元音返回为真,辅音返回为假:

(vowel? (first "abc")) ; => true
(vowel? (first "cba")) ; => false
为什么会这样?我假设它与变量名后面的问号有关。在教程中无法立即找到任何内容



Edit我刚刚意识到
元音?
不会返回true或false,而是返回元素本身或nil。看看我自己的答案。

啊哈!最后我自己发现了。它实际上并不返回
true
false
,而是返回集合中第一次出现的值,如果没有出现,则返回nil

因为您可以使用它作为一个条件(nil被处理为false,non-nil被处理为true),所以这是一个很好的小技巧,用于检查字符串是否包含字母

(vowel? (first "abc")) ; => "a"
(vowel? (first "cba")) ; => nil

(if (vowel? (first "abc"))
       (println "yay")
       (println "oops"))  ; => "yay"

这与地图(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

但是,同样,后一种技巧只适用于关键字,而不适用于任何其他可能用作映射中的键或集合中的成员的东西

听起来不错。问号表示它可以用作测试。您经常会在有副作用的函数上看到感叹号。它们不是语言的一部分,它们是lisp的传统(所以你知道安全函数和“危险”函数的区别)?还有!只是像a和b这样的字符,您可以使用它们来命名符号(如\、/、*、-、+…)。用Lisp命名某些符号有一些传统,但方言之间有一些小的差异。啊,谢谢@svante!我还以为“?”:)有点神奇