Clojure 编程/示例/API 示例/宏
外观
这是“线程”运算符。
(macroexpand-1 '(-> true (if "clojure")))
=>(if true "clojure")
这个
user=> (-> "abc" .toUpperCase ,, (.replace ,, "B" "-"))
"A-C"
等效于
user=> (.replace (.toUpperCase "abc") "B" "-")
"A-C"
注意:您不需要插入“','”,因为 Clojure 将它们视为空格,但以这种方式标记表单的第二个位置可以提高可读性。
但是 -> 对所有内容都有效
user=> (-> true (if ,, inc dec) (map ,, [1 2 3]))
(2 3 4)
或者扩展
(map (if true inc dec) [1 2 3])
因此,人们也可以在 -> 中使用宏和普通函数,即非方法。
以下示例应该让每一位忠实的程序员爱上 Lisp,如果他将其与等效的 Java 代码进行比较。读取 zip 文件中的第一个条目的名称
user=> (import '(java.net URL) '(java.util.zip ZipInputStream))
nil
user=> (-> "http://clojure.googlecode.com/files/clojure_20081217.zip" URL. .openStream ZipInputStream. .getNextEntry bean :name)
"clojure/"
user=> (cond false 1 true 2)
2
user=> (cond nil 1 2 3)
3
(let [a 5]
(condp = a
1 "hi"
5 "fun"))
-> "fun"
测试表达式(上面的示例中为 1 和 5)被插入作为谓词函数的第一个参数,比较表达式(此处为 a)作为第二个参数。condp 在上面的示例中,如果没有匹配到任何子句,就会抛出 java.lang.IllegalArgumentException。condp 还允许在子句之后添加一个默认表达式,如果没有任何子句匹配,就会返回该表达式的值。
(let [a 7]
(condp = a
1 "hi"
5 "fun"
"no match"))
-> "no match"