标签:clojure
(defmacro infix "Use this macro when you pine for the notation of your childhood" [infixed] (list (second infixed) (first infixed) (last infixed)))
(infix (1 + 1)) ; => 2
上面的例子中,其实经过了去除最后一个symbol,然后再对余下的list求值的过程。
(+ 1 2 10) -> (+ 1 2) -> 3
要想知道最后求值结果出来前的list,可以使用macroexpand. 注意要配合使用‘ 表示不要求值。
user=> (macroexpand ‘(ignore-last-operand (+ 1 2 10))) (+ 1 2)
(defn read-resource "Read a resource into a string" [path] (read-string (slurp (clojure.java.io/resource path))))
(defn read-resource
[path]
(-> path
clojure.java.io/resource
slurp
read-string))binding宏用来创建线程专属的变量,在多线程中很常用。
user=> (def ^:dynamic x 1)
user=> (def ^:dynamic y 1)
user=> (+ x y)
2
user=> (binding [x 2 y 3]
(+ x y))
5
user=> (+ x y)
2可以接受一堆参数,如果条件为真,这些参数都依次被求值,返回最后一个求值的结果。when的实现是用(if 和 (do。
(macroexpand ‘(when boolean-expression
expression-1
expression-2
expression-3))
; =>
(if boolean-expression
(do expression-1
expression-2
expression-3))版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:clojure
原文地址:http://blog.csdn.net/csfreebird/article/details/49444467