学习Clojure第九天
2017-03-29 本文已影响0人
ukao
副作用(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个,其余的只需访问的时候才加载