Clojure语法学习-循环
do和塊語(yǔ)句
在Scala中,花括號(hào){}括起來(lái)的語(yǔ)句構(gòu)成一個(gè)block,它的值就是最后一個(gè)語(yǔ)句的值。
scala> val a = {| println("a")| 1} a a: Int = 1{println("a"); 1}的值為1。
在Clojure中,有時(shí)需要使多個(gè)form組成一個(gè)block, 這個(gè)block的值是最后一個(gè)form的值。這時(shí)候就用do
user=> (def a (do (println "a") 1)) a #'user/a user=> a 1do takes any number of forms, evaluates them all, and returns the last.
do接受任意多的form作為參數(shù),對(duì)它們分別求值,然后返回最后一個(gè)form的值。
?循環(huán)
有哪些要素才能構(gòu)成一個(gè)循環(huán)?
在Java中
在Clojure中
也就是說(shuō)Java需要我們告訴它什么時(shí)候退出循環(huán),而Clojure需要我們告訴它何時(shí)繼續(xù)循環(huán)。
Java的for循環(huán)是這樣的
for(int i = 0; i < 10; i++)System.out.println(i);可以認(rèn)為 i< 10, i++以及System.out.println(i)構(gòu)成了循環(huán)體。退出條件為i<10。
while循環(huán)與for循環(huán)的不同之處在于while無(wú)法聲明只在循環(huán)內(nèi)部使用的變量。在上邊的for循環(huán)中, i只在循環(huán)內(nèi)部使用。如果我們想讓while有類(lèi)似的功能(當(dāng)然,while沒(méi)這功能),那么while需要接受一個(gè)初始化語(yǔ)法,變成
while(int i = 0)(i < 10){println(i);i++; }?在Clojure中,同樣可以以binding的形式提供初始化語(yǔ)句, 以及提供循環(huán)體。這通過(guò)loop這種form來(lái)實(shí)現(xiàn)
(loop [bindings *] exprs*)
這就類(lèi)似前邊這個(gè)加強(qiáng)版的while。同時(shí),在while循環(huán)中需要break來(lái)打破循環(huán); 在Clojure中,我們需要一種form來(lái)繼續(xù)循環(huán),這就是recur。可以認(rèn)為Java的循環(huán)是主動(dòng)的,而Clojure中的是被動(dòng)的,你必須在代碼中驅(qū)動(dòng)它前進(jìn)。
(loop [a 0] (if (< a 10) (do (println a) (recur (+ 1 a)))))recur使得程序重新開(kāi)始執(zhí)行l(wèi)oop。但是如何程序中是簡(jiǎn)單地重新執(zhí)行l(wèi)oop,它就只是原地踏步,因?yàn)樗械慕壎ǘ际冀K是初始值。所以recur不僅轉(zhuǎn)變了程序的執(zhí)行流,而且修改了loop開(kāi)始的綁定。即,recur使得loop開(kāi)始對(duì)a的綁定變成了(+ 1 a)。
假如,我們?cè)趌oop開(kāi)始的時(shí)候多提供一個(gè)綁定
(loop [a 0 b 1] (if (< a 10) (do (println a) (recur (+ 1 a)))))REPL就會(huì)告訴我們提供給recur的參數(shù)個(gè)數(shù)不對(duì)
CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 2 args, got: 1
實(shí)際上,recur不僅可以用于loop,也可以用于函數(shù),它使得函數(shù)被重新執(zhí)行。
舉個(gè)書(shū)上的例子
(defn countdown [result x] (if (zero? x) result (recur (conj result x) (dec x))))執(zhí)行(count down [] 5)會(huì)輸出返回值[5 4 3 2 1]
這種代碼怎么看著這么眼熟呢?這不就像是尾遞歸嗎?
?
轉(zhuǎn)載于:https://www.cnblogs.com/devos/p/4207707.html
總結(jié)
以上是生活随笔為你收集整理的Clojure语法学习-循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在script所在位置插入内容
- 下一篇: cssText