1. & varparam
相当于java中的可变参数, eg (defmacro defserverfn [name & body] ...), body表示其余的一个或者多个参数。
2. (list 1 2 3)
(1 2 3) 创建一个新列表。
3. unquote
`(1 2 ~(list 3 4)) => (1 2 (3 4)) 对表达进行evaluate操作。
4. unquote-splice
`(1 2 ~@(list 3 4)) => (1 2 3 4) 对表达式进行evaluate操作,去掉操作后的括号。
5. '(1 2 3)
quote,原文显示列表,不对列表进行evaluate操作。
6. #(operator %1 %2 %3 %4 %5)
(map #(+ % 3) [2 4 7]) ; -> (5 7 10) 创建匿名函数。
7. (map #(+ % 3) [2 4 7]) ; -> (5 7 10)
将函数一次应用于指定列表数据中的每一个数据,函数是源,数据是标的,类似java在一个数据集上使用迭代器循环操作。
8. (apply + [2 4 7]); -> 13
把给定的集合里面的所有元素一次性地给指定的函数作为参数调用,然后返回这个函数的返回值,数据是源,函数是标的。
与map的区别就是map返回的还是一个集合,而apply返回的是一个元素, 可以把apply看作是SQL里面的聚合函数。
9. (let [a 1 b 2] (+ a b))
symbol binding. make a=1 and b=2 , then compute a+b, and finally print the result。
10. prefix#
在宏中使用,auto-gensym,在宏编译时产生唯一的symbol名字,防止命名冲突。
11. (doseq [x [1 2 3] y [1 2 3]] (prn (* x y)))
将参数x, y在各自指定的数据集上进行笛卡尔积混排后,按照指定函数进行运算,返回结果列表,类似java中的多重for循环。
12. (assoc {:key1 "old value1" :key2 "value2"} :key1 "value1" :key3 "value3") -> {:key3 "value3", :key2 "value2", :key1 "value1"}
将原始map中指定的key替换为指定的值,如果原始key不存在,则新增。
13. (defrecord Employee [name room])
定义数据类型Employee, 其中有两个字段,名称分别为name和room。
(def emp (Employee. "John Smith" 304))
实例化一个Employee对象。
(:name emp)
获取emp对象中的name字段值。
14. (str 1 2 3) -> "123"
字符串连接。
15. (defnk f [:b 10] (inc b))
和defn的区别在于可以为参数指定默认值,实际调用的时候如果不传参数,会使用默认值进行计算,否则采用传入的参数
(f) -> 11
(f :b 100) -> 101
16. (a/b)
调用命名空间a下的函数b.
17. (.. class-or-object (method1 args) (method2 args) (method3 args) )
串行连续调用多个函数,第一个函数的返回值作为第二个函数的第一个参数,以此类推。
18. 下划线(_)
经常在clojure代码的let语句块中看到下划线,例如:(let [a (expr_for_a) _ (println "log") b (expr_for_b)] (expr_body))
由于let中参数绑定均为k v 形式,在有些情况下,我们只在乎v表达式的执行,而不在乎返回值,此时k的位置需