美文网首页
学习Clojure第十一、第十二天

学习Clojure第十一、第十二天

作者: ukao | 来源:发表于2017-04-01 00:23 被阅读0次

    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第十一、第十二天

          本文链接:https://www.haomeiwen.com/subject/phayottx.html