亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

無廢話JavaScript教程(全集)第3/4頁

 更新時(shí)間:2008年10月07日 23:28:35   作者:  
許多讀者認(rèn)為我那本《JavaScript語言精髓與編程實(shí)踐》讀來辛苦,所以我一直想寫個(gè)簡單的讀本。索性,這次就寫個(gè)最簡單的吧。

五、函數(shù)式
這個(gè)可不是JavaScript的發(fā)明,它的發(fā)明人已經(jīng)死了,而他的這個(gè)發(fā)明還在困擾著我們……如同愛迪生的燈
泡還在照耀著我們。
其實(shí)函數(shù)式語言很簡單,它就是一種與命令式語言同樣“完備”的語言實(shí)現(xiàn)方案。由于它的基礎(chǔ)思想與命令
式——如果你不想用這個(gè)難于理解的名詞,那就把它換成C,或者Delphi好了——語言完全不同,所以大多數(shù)
情況下,它也與這些傳統(tǒng)的、通用的、商業(yè)化的語言格格不入。
而事實(shí)上,你天天都在用它。
下面這行代碼,就充滿了函數(shù)式語言的思想:
a + b
是嗎?真的,如果你把那個(gè)“+”號看成一個(gè)函數(shù),就完全一樣了。事實(shí)上,所謂函數(shù)(function),就是一個(gè)
執(zhí)行過程、一段運(yùn)算、一個(gè)功能入口……也就是說,代碼中的某個(gè)東西,要么它是數(shù)據(jù),要么它是運(yùn)算。而如
果它是運(yùn)算,你就可以把它看成“函數(shù)”。上面這行代碼——表達(dá)式中,a和b顯然是數(shù)據(jù),而+號則是對之進(jìn)
行操作的運(yùn)算,所以它自然可以看成一個(gè)“功能、過程或運(yùn)算”。所以……操作兩個(gè)數(shù)求和的“函數(shù)”可以寫
成這樣:
func_add(a, b)
或者這樣:
(+ a b)
所有這些,只是文字上的標(biāo)記法不同而已。就好象我說這個(gè)符號是“jia”,而你非得說它是“暗得”,另一個(gè)
人卻非要讀作“a-d-d”。有什么不同嗎?沒有。
所有程序員天天都在寫語句,寫表達(dá)式,與運(yùn)算邏輯。大家都知道這些東西都可以寫在一個(gè)……嗯……無比巨
大的函數(shù)里,或者分在無數(shù)個(gè)小的、看起來很漂亮的函數(shù)里。當(dāng)所有這些函數(shù)一個(gè)又一個(gè)連續(xù)起來運(yùn)算時(shí),它
就成了“函數(shù)式語言”。所以稱為“函數(shù)式語言的祖老爺爺”的LISP就是這樣“把函數(shù)運(yùn)算連起來”的語言:
復(fù)制代碼 代碼如下:

(defun subst (x y z)
(cond ((atom z)
(cond ((eq z y) x)
('t z)))
('t (cons (subst x y (car z))
(subst x y (cdr z))))))

有人認(rèn)為它是丑陋的意大利面條,也有人認(rèn)為它是最簡潔的語言。Oh,隨你,了解了就好了,管它象什么尼。
由于函數(shù)式語言只有連續(xù)執(zhí)行的函數(shù)——所以它沒有了“語句”而又必須實(shí)現(xiàn)邏輯上的完整性。簡單地說,他
需要在連續(xù)執(zhí)行的過程中實(shí)現(xiàn)“順序、分支與循環(huán)”三個(gè)基本邏輯。函數(shù)式的解決之道,是用三元條件運(yùn)算來
代替if/then/else,也就下面的代碼:
if a then b else c
// 相當(dāng)于
a ? b : c
另外,就是用遞歸(函數(shù)調(diào)函數(shù))來實(shí)現(xiàn)循環(huán)??紤]到遞歸函數(shù)調(diào)用中會導(dǎo)致棧溢出(Stack overflow at ...),
所以函數(shù)式語言就提出了“尾遞歸”,也就是在書寫代碼是“確保”僅只在函數(shù)內(nèi)的最后一個(gè)運(yùn)算中遞歸調(diào)用。
這樣一來,這個(gè)遞歸調(diào)用就不需要保留棧了——因?yàn)樵贈]有后續(xù)運(yùn)算了,因此就能被優(yōu)化成一行不需要返回的
jmp匯編指令。
世界真美好,所謂函數(shù)式不過是一堆運(yùn)算入口,以及jmp、jmp、jmp。但,但是,難道不是嗎——這塊CPU?
六、更高級的函數(shù)式(1)
其實(shí)世界并不美好。
如果一塊CPU死躺在那里,它也就只有順序呀、分支啦、循環(huán)之類的指令在里頭。但是當(dāng)它運(yùn)行起來,就得有一
個(gè)時(shí)鐘在滴嗒…滴嗒…如果是多核的,還會同時(shí)有好幾個(gè)這樣的東東在滴嗒著。
這就是問題,世界原本不是單一時(shí)序,也不是守序的。所以會有并發(fā),會有中斷,也會有異常。函數(shù)式語言應(yīng)
該自己應(yīng)該像意大利面條一樣無限延展開去,那么是不是有多個(gè)滴嗒時(shí)就該有多根意大利面條呢?但,這種情
況下還叫意大利面條嗎?
函數(shù)式里的解決方案叫延續(xù)(Continuation)和結(jié)點(diǎn)。延續(xù)是停止當(dāng)前轉(zhuǎn)到另一處、然后再返回來;而結(jié)點(diǎn)則確
保一個(gè)位置上的代碼是獨(dú)立完備的,與另一個(gè)結(jié)點(diǎn)無關(guān)。在函數(shù)式語言中,多個(gè)結(jié)點(diǎn)就象平行宇宙,大多數(shù)情
況下它們是互相透明的,如果它們要發(fā)生聯(lián)系,得需要極其巨大的能量,以及……一個(gè)蟲洞。
多個(gè)結(jié)點(diǎn)的問題我們不需要深究,多個(gè)空間下的訪問帶來的時(shí)空問題,是天體學(xué)家以及時(shí)空多維理論家們研究
的問題,我們只需要知道:如果你希望多個(gè)結(jié)點(diǎn)之間存在交叉的訪問關(guān)系,那么世界/宇宙會因此毀滅。這樣類
似的說明寫在ErLang這類天生支持多個(gè)宇宙的語言的白皮書、參考手冊以及宇航員日常指南之中。如果你要窮
究其根源,并且認(rèn)為自己已經(jīng)能明確了解300個(gè)以上的高等數(shù)字、物理學(xué)和天體學(xué)術(shù)語,地么下面有一份面向程
序員的入口指引,不妨從這里開始:

相關(guān)文章

最新評論