clojure语法小记

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的位置需

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值