学习Clojure第九天

副作用(side effects)

(+ 1 2)计算的到3,就没有副作用,但是(println "hi")返回一个nil,这个就是副作用,你不会用println来返回任何值。
一般来说纯粹的函数是没有副作用的,也不依赖于外部的计算。

(do
  (println "Spinning up warp drive, captain ...")
  (spin-up-warp-drive)
  (get-engine-temperature))

一般来说如果要用副作用,需要才用"do"的写法

(def my-items ["shirt" "coat" "hat"])

(doseq [i my-items]
  (println i))

(dotimes [i 10]
  (println "counting:" i))

另外如果使用let使用副作用一般使用下划线"_"

v=(let [_ (do-something)
      _ (println "done with that")
      x 10]
  ...)

解构(Destructuring)

解构是函数式语言的一种方便的写法
下面是Vector普通分别赋值的情况

(def games [:chess :checkers :backgammon :cards])

(let [game-a (games 0)
      game-b (games 1)
      game-c (games 2)
      game-d (games 3)]
  ...
  ...)

下面是解构的写法,方便多了吧

(let [[game-a game-b game-c game-d] games]
  ...
  ...)

Map也有解构语法,这是普通语法

(def concert {:band     "The Blues Brothers"
              :location "Palace Hotel Ballroom"
              :promos   "Ladies night, tonight"
              :perks    "Free parking"})

(let [band     (concert :band)
      location (concert :location)
      promos   (concert :promos)
      perks    (concert :perks)]
  ...
  ...)

解构语法

(let [{band     :band
       location :location
       promos   :promos
       perks    :perks} concert]
  ...
  ...)

还可以这样写

(let [{:keys [band location promos perks]} concert]
  ...
  ...)

懒加载(Laziness)

Clojure所有的序列(Map,reduce,filter,for等)的访问都是懒加载,意思是如果一个序列,你只请求5个值,那么只会加载5个,其余的只需访问的时候才加载

你可能感兴趣的:(学习Clojure第九天)