学习Clojure第十一、第十二天
2017-04-01 本文已影响0人
ukao
partial,comp and iterate
partial,创建一个新的函数,这个函数包含一个已经传递了参数的函数,这个新的函数只需要补齐参数就可以了。
(defn lots-of-args [a b c d] (str/join "-" [a b c d]))
;; ⇒ #'user/lots-of-args
(lots-of-args 10 20 30 40)
;; ⇒ "10-20-30-40"
(def fewer-args (partial lots-of-args 10 20 30))
;; ⇒ #'user/fewer-args
(fewer-args 40)
;; ⇒ "10-20-30-40"
(fewer-args 99)
;; ⇒ "10-20-30-99"
(def fewer-args1 (partial lots-of-args 10 20))
(fewer-args1 30 40)
;; ⇒ "10-20-30-40"
comp函数将多个函数组合起来
(defn wrap-in-stars [s] (str "*" s "*"))
(defn wrap-in-equals [s] (str "=" s "="))
(defn wrap-in-ats [s] (str "@" s "@"))
(def wrap-it (comp wrap-in-ats
wrap-in-equals
wrap-in-stars))
(wrap-it "hi")
;; ⇒ "@=*hi*=@"
;; Which is the same as:
(wrap-in-ats (wrap-in-equals (wrap-in-stars "hi")))
;; ⇒ "@=*hi*=@"
(iterate foo x)会产生一个无限的懒加载列表,如下:
(x
(foo x)
(foo (foo x))
(foo (foo (foo x)))
...)
获取5次调用的方法:
(defn square [x] (* x x))
(take 5 (iterate square 2))
;; ⇒ (2 4 16 256 65536)
循环和递归(Looping and Recursion)
引用类型(Reference Type)
我们一直强调Clojure是没有变量的,所有的值都是不可变的,但也不是完全正确,clojure也提供可变的变量,如果需要的话,那就是引用类型。CLojure提供内置的支持去做变化。
一共有3种类型的引用:
1.Atoms
2.Refs
3.Agents
创建Atoms的格式如下:
(def my-atom (atom {}))
引用类型是atom,形式是一个空的hashmap,my-atom指向这个atom。
看一下例子,如果要修改这个引用,需要使用@语法,另外swap!是atom专用函数其他的引用类型会有其他的函数。
(def my-atom (atom {:foo 1}))
;; ⇒ #'user/my-atom
@my-atom
;; ⇒ {:foo 1}
(swap! my-atom update-in [:foo] inc)
;; ⇒ {:foo 2}
@my-atom
;; ⇒ {:foo 2}