跳至内容

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"
华夏公益教科书