理論領(lǐng)域中的“代碼即數(shù)據(jù)”——
(1)純lambda演算中,所有的數(shù)據(jù)類型都可以表示成lambda表達(dá)式,所有的操作都是lambda表達(dá)式的應(yīng)用。
(2)邏輯編程中,數(shù)據(jù)和操作都可以歸結(jié)成邏輯項(xiàng)。
上個(gè)世紀(jì)50年代時(shí),人工智能研究中人們發(fā)現(xiàn)list這種數(shù)據(jù)結(jié)構(gòu)的威力,lambda表達(dá)式和邏輯項(xiàng)都可以用list在機(jī)器中表達(dá)。S表達(dá)式可算為list的書寫形式。
在這些因素的推動下,于是就有了麥卡錫及其人工智能團(tuán)隊(duì)發(fā)明(也可以說發(fā)現(xiàn))lisp語言的偉大傳說。S表達(dá)式非常偶然也十分必然的成為了lisp程序的書寫形式。
在理論意義上,lisp核心是可以和lambda演算、數(shù)理邏輯并列的一個(gè)新的形式系統(tǒng),語言內(nèi)核可以用一組公理表示。像PG這樣的死忠粉絲認(rèn)為,這正是lisp不同于非lisp語言的本質(zhì)之處,也是它與時(shí)俱進(jìn)的奧秘所在。
起初lisp多以解釋器實(shí)現(xiàn),元編程不需要宏,有eval就夠了,這和現(xiàn)在javascript之流類似。元編程=表處理+eval。 javascript中的json形式如果再開發(fā)一下,也可以成為元編程的工具。
直到上個(gè)世紀(jì)70年代lisp編譯器開始走上舞臺時(shí),宏才引入lisp主流。但是又一個(gè)歷史的偶然,讓lisp宏和其他語言的宏具有本質(zhì)的不同。
lisp的開發(fā)者如此熱愛這個(gè)語言,因此他們用lisp本身來寫它的編譯器,因?yàn)橄扔薪忉屍髟?。lisp的宏雖然本質(zhì)還是表處理,但由于在宏解析階段可以使用lisp解釋器,它可以使用lisp整個(gè)語言和庫,這和編寫一個(gè)lisp函數(shù)幾乎沒有區(qū)別。你無法想象在c語言宏中,你可以使用c語言自己。
所以死忠lisp粉絲如PG者,反對Scheme的宏設(shè)計(jì),因?yàn)槟鞘且粋€(gè)DSL,是從lisp的立場向非lisp語言倒退。
但是Scheme方言對lisp的發(fā)展也有很大的意義。
70年代在程序設(shè)計(jì)語言的歷史,另一個(gè)偉大的進(jìn)步就是面向?qū)ο蠹夹g(shù),smalltalk等許多新語言誕生了。lisp陣營的回答是,閉包是比對象更基礎(chǔ)的語言設(shè)施。Scheme語言把詞法定域引入了lisp語言,為閉包的實(shí)現(xiàn)打下了基礎(chǔ)。
又一個(gè)歷史的偶然,Scheme的語言的設(shè)計(jì)者之一又加入common lisp語言委員會,作為一個(gè)大雜燴,詞法定域和閉包特性就成為了common lisp的關(guān)鍵特征。
再說說死忠lisp粉絲的觀點(diǎn),哥不需要面向?qū)ο?,哥只要宏+閉包就ok了。
以上是我個(gè)人對lisp語言發(fā)展的淺見,三個(gè)歷史偶然造就了偉大的common lisp,純屬胡謅,大家見笑。
快過年了,希望能給組里的lisp同好們帶去一些歡樂。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。