学习Clojure第十一、第十二天

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}

你可能感兴趣的:(学习Clojure第十一、第十二天)