当前位置:  开发笔记 > 编程语言 > 正文

为什么"(def vowel?(set"aeiou"))"工作?

如何解决《为什么"(defvowel?(set"aeiou"))"工作?》经验,为你挑选了2个好方法。

我在这里看一下优秀的Clojure教程.在其中一个示例中,它具有以下行的Clojure代码:

(def vowel? (set "aeiou"))

这使元音的元音返回true,辅音返回false:

(vowel? (first "abc")) ; => true
(vowel? (first "cba")) ; => false

为什么是这样?我假设它与变量名后面的问号有关.在教程中找不到任何东西......


编辑我刚刚意识到vowel?不会返回true或false,而是返回元素本身或者nil.看看我自己的答案.



1> Jouni K. Sep..:

这完全类似于地图(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

但是,再一次,后一种技巧只能用于关键字,而不能用作映射中的键或集合中的成员.



2> Epaga..:

啊哈!我最终找到了自己.它实际上并不返回,true或者false它返回集合中的第一个匹配项,如果不发生则返回nil.

并且因为你可以使用它作为一个条件(nil被处理为false,非nil为true),这可以作为一个很好的小hack来检查一个字符串是否包含一个字母.

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

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


为了说清楚,?而且!只是像a和b这样的字符,你可以用它们来命名符号(如\,/,*, - ,+ ...).在Lisp中存在命名某些符号的传统,但方言之间存在细微差别.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有