Clojure学习总结

1、Clojure认为值是最重要的概念,值可以是数字,字符串,向量,映射,集合。注:值定义后就不可修改,如果修改只能重新引用值关系,不能直接修改值
2、Clojure使用def绑定值得关系。例如:(def hello (fn [] "hello world")) 意思是定义hello函数打印hello world。
使用defn重新绑定值的关系。例如:(defn hello [] "goodnight moon")
3、Clojure希望第一个参数是函数值,如果不为函数值会报错,quote除外。该方法返回后续列表值。例如:(queto (1 2 3)) ==>(1 2 3)
4、Clojure的向量使用vector,该函数值等同于JAVA中的LinkedList或ArrayList。例如:(vector 1 2 3) ==》 [1 2 3] 注:可以使用简化方式(vec '(1 2 3))
5、Clojure的函数nth有两个参数,集合和索引。 例如:(nth '(1 2 3) 1) ==> 2
6、Clojure支持映射即java中的hashmap,使用{},带冒号的映射键称为关键字。 例如:(def foo {"a" "a1" "b" "b1"}) (foo "a") ==> "a1" (def person {:nmae "chenbowne",:age "18"}) (person :name) ==> "chenbowen"
7、Clojure支持集即java中的set,例如: #{"apple" "pair" "peach"}
8、Clojure的sort-by函数有两个参数,一个用来排序的函数,一个是要排序的向量
9、Clojure使用读取器宏和派发读取宏简化代码。例如:#' 标识展开为(var); #{} 表示
10、Clojure序列使用seq,基本序列函数如下:
(1) (seq )返回一个序列,所操作集合的视图;(first )返回序列第一个元素,如果集合为空则返回nil
(rest )从集合去掉第一个元素后返回新的序列,为nil则返回nil;(seq? )如果O为序列则返回true
(cons )在集合前面新增元素,并返回新序列;(conj )返回将新元素加到合适一端新的序列。
(every? )如果(pred-fn)对集合中的每个元素都返回逻辑真,则返回true;
11、Clojure可以使用带变元参数的函数,例如: (defn const-fun-arity1 ([] 1) ([x] 1) ([x & more] 1)) 表示const-fun-arity1函数可以不带参数,带一个参数,带一个或多个参数。但是都返回1。
12、Clojure可以直接使用java中的方法,底层用.宏实现的,可以直接使用Object的方法,可以使用import导入JAVA类。例如(defn printLen [y] (.length (.toString y))) (import '(java.util ArrayList LinkedList))
13、Clojure的宏proxy可以扩展JAVA类或接口。例如:(def lbq (LinkedBlockingQueue))(def msgRdr (proxy [Runnable] [] (run [] (.toString (.poll lbq))))) 表示实现Runnable接口

你可能感兴趣的:(Clojure)