跳至內容

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"
華夏公益教科書