欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

無(wú)廢話JavaScript教程(全集)第3/4頁(yè)

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

五、函數(shù)式
這個(gè)可不是JavaScript的發(fā)明,它的發(fā)明人已經(jīng)死了,而他的這個(gè)發(fā)明還在困擾著我們……如同愛(ài)迪生的燈
泡還在照耀著我們。
其實(shí)函數(shù)式語(yǔ)言很簡(jiǎn)單,它就是一種與命令式語(yǔ)言同樣“完備”的語(yǔ)言實(shí)現(xiàn)方案。由于它的基礎(chǔ)思想與命令
式——如果你不想用這個(gè)難于理解的名詞,那就把它換成C,或者Delphi好了——語(yǔ)言完全不同,所以大多數(shù)
情況下,它也與這些傳統(tǒng)的、通用的、商業(yè)化的語(yǔ)言格格不入。
而事實(shí)上,你天天都在用它。
下面這行代碼,就充滿了函數(shù)式語(yǔ)言的思想:
a + b
是嗎?真的,如果你把那個(gè)“+”號(hào)看成一個(gè)函數(shù),就完全一樣了。事實(shí)上,所謂函數(shù)(function),就是一個(gè)
執(zhí)行過(guò)程、一段運(yùn)算、一個(gè)功能入口……也就是說(shuō),代碼中的某個(gè)東西,要么它是數(shù)據(jù),要么它是運(yùn)算。而如
果它是運(yùn)算,你就可以把它看成“函數(shù)”。上面這行代碼——表達(dá)式中,a和b顯然是數(shù)據(jù),而+號(hào)則是對(duì)之進(jìn)
行操作的運(yùn)算,所以它自然可以看成一個(gè)“功能、過(guò)程或運(yùn)算”。所以……操作兩個(gè)數(shù)求和的“函數(shù)”可以寫
成這樣:
func_add(a, b)
或者這樣:
(+ a b)
所有這些,只是文字上的標(biāo)記法不同而已。就好象我說(shuō)這個(gè)符號(hào)是“jia”,而你非得說(shuō)它是“暗得”,另一個(gè)
人卻非要讀作“a-d-d”。有什么不同嗎?沒(méi)有。
所有程序員天天都在寫語(yǔ)句,寫表達(dá)式,與運(yùn)算邏輯。大家都知道這些東西都可以寫在一個(gè)……嗯……無(wú)比巨
大的函數(shù)里,或者分在無(wú)數(shù)個(gè)小的、看起來(lái)很漂亮的函數(shù)里。當(dāng)所有這些函數(shù)一個(gè)又一個(gè)連續(xù)起來(lái)運(yùn)算時(shí),它
就成了“函數(shù)式語(yǔ)言”。所以稱為“函數(shù)式語(yǔ)言的祖老爺爺”的LISP就是這樣“把函數(shù)運(yùn)算連起來(lái)”的語(yǔ)言:
復(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)為它是最簡(jiǎn)潔的語(yǔ)言。Oh,隨你,了解了就好了,管它象什么尼。
由于函數(shù)式語(yǔ)言只有連續(xù)執(zhí)行的函數(shù)——所以它沒(méi)有了“語(yǔ)句”而又必須實(shí)現(xiàn)邏輯上的完整性。簡(jiǎn)單地說(shuō),他
需要在連續(xù)執(zhí)行的過(guò)程中實(shí)現(xiàn)“順序、分支與循環(huán)”三個(gè)基本邏輯。函數(shù)式的解決之道,是用三元條件運(yùn)算來(lái)
代替if/then/else,也就下面的代碼:
if a then b else c
// 相當(dāng)于
a ? b : c
另外,就是用遞歸(函數(shù)調(diào)函數(shù))來(lái)實(shí)現(xiàn)循環(huán)。考慮到遞歸函數(shù)調(diào)用中會(huì)導(dǎo)致棧溢出(Stack overflow at ...),
所以函數(shù)式語(yǔ)言就提出了“尾遞歸”,也就是在書寫代碼是“確保”僅只在函數(shù)內(nèi)的最后一個(gè)運(yùn)算中遞歸調(diào)用。
這樣一來(lái),這個(gè)遞歸調(diào)用就不需要保留棧了——因?yàn)樵贈(zèng)]有后續(xù)運(yùn)算了,因此就能被優(yōu)化成一行不需要返回的
jmp匯編指令。
世界真美好,所謂函數(shù)式不過(guò)是一堆運(yùn)算入口,以及jmp、jmp、jmp。但,但是,難道不是嗎——這塊CPU?
六、更高級(jí)的函數(shù)式(1)
其實(shí)世界并不美好。
如果一塊CPU死躺在那里,它也就只有順序呀、分支啦、循環(huán)之類的指令在里頭。但是當(dāng)它運(yùn)行起來(lái),就得有一
個(gè)時(shí)鐘在滴嗒…滴嗒…如果是多核的,還會(huì)同時(shí)有好幾個(gè)這樣的東東在滴嗒著。
這就是問(wèn)題,世界原本不是單一時(shí)序,也不是守序的。所以會(huì)有并發(fā),會(huì)有中斷,也會(huì)有異常。函數(shù)式語(yǔ)言應(yīng)
該自己應(yīng)該像意大利面條一樣無(wú)限延展開(kāi)去,那么是不是有多個(gè)滴嗒時(shí)就該有多根意大利面條呢?但,這種情
況下還叫意大利面條嗎?
函數(shù)式里的解決方案叫延續(xù)(Continuation)和結(jié)點(diǎn)。延續(xù)是停止當(dāng)前轉(zhuǎn)到另一處、然后再返回來(lái);而結(jié)點(diǎn)則確
保一個(gè)位置上的代碼是獨(dú)立完備的,與另一個(gè)結(jié)點(diǎn)無(wú)關(guān)。在函數(shù)式語(yǔ)言中,多個(gè)結(jié)點(diǎn)就象平行宇宙,大多數(shù)情
況下它們是互相透明的,如果它們要發(fā)生聯(lián)系,得需要極其巨大的能量,以及……一個(gè)蟲(chóng)洞。
多個(gè)結(jié)點(diǎn)的問(wèn)題我們不需要深究,多個(gè)空間下的訪問(wèn)帶來(lái)的時(shí)空問(wèn)題,是天體學(xué)家以及時(shí)空多維理論家們研究
的問(wèn)題,我們只需要知道:如果你希望多個(gè)結(jié)點(diǎn)之間存在交叉的訪問(wèn)關(guān)系,那么世界/宇宙會(huì)因此毀滅。這樣類
似的說(shuō)明寫在ErLang這類天生支持多個(gè)宇宙的語(yǔ)言的白皮書、參考手冊(cè)以及宇航員日常指南之中。如果你要窮
究其根源,并且認(rèn)為自己已經(jīng)能明確了解300個(gè)以上的高等數(shù)字、物理學(xué)和天體學(xué)術(shù)語(yǔ),地么下面有一份面向程
序員的入口指引,不妨從這里開(kāi)始:

相關(guān)文章

最新評(píng)論