前言
在有些人看來(lái),lisp是種“反智”的,違反人類自然語(yǔ)言邏輯的語(yǔ)言,它只在數(shù)理邏輯上擁有一定意義。事實(shí)證明了它只能在小范圍普及使用,但不妨經(jīng)常有人對(duì)它推崇備至并宣傳。
對(duì)LISP語(yǔ)言不同觀點(diǎn)以及看法,我覺得應(yīng)該要勇于實(shí)踐實(shí)踐,學(xué)了再自己做判斷。沒有自己思考和實(shí)踐,不要輕易相信或者排斥任何觀點(diǎn)。這些觀點(diǎn)的唯一作用就是提供了你一個(gè)看事物的新角度和調(diào)查的起點(diǎn)。
本文只是個(gè)人的對(duì)LISP語(yǔ)言特點(diǎn)以及總的概括,如有不足之處還請(qǐng)見諒。
關(guān)于LISP概述
程序語(yǔ)言本身就不是為了符合自然語(yǔ)言的邏輯而去開發(fā)的,它是為了開發(fā)為人所用的軟件的,它是為了更容易兼容機(jī)器,讓機(jī)器理解是首要考慮,Lisp也一樣,數(shù)理邏輯只是一套方法,Lisp是活生生的具體實(shí)現(xiàn)了,顯然比那些高逼格的理論要來(lái)得實(shí)際得多,這一點(diǎn)比數(shù)理邏輯要高級(jí)吧。
早期的程序員用Lisp的可是很多的,只不過(guò)后來(lái)隨著軟件規(guī)模的擴(kuò)大,需要擴(kuò)充的東西比較多,而Lisp是以簡(jiǎn)潔著稱的,由于它的開發(fā)環(huán)境實(shí)在太簡(jiǎn)陋,所以越來(lái)越不能被多數(shù)程序員接受。其實(shí)它一樣可以開發(fā)現(xiàn)有的軟件的,只要你愿意去用,它絕不輸現(xiàn)在的任何流行語(yǔ)言。
人們推崇它很大一方面是受了某些人的宣傳然后為了滿足一下自己的好奇心,就去嘗試了。真的有那么多人推崇Lisp嗎?真的有用它去開發(fā)東西嗎?這我無(wú)法回答。?
?
看法一:(支持)
1、lisp高級(jí)又基礎(chǔ),lisp沒有python或者ruby里那些便利的數(shù)組或者h(yuǎn)ash操作函數(shù),很多時(shí)候,lisp的數(shù)據(jù)只由2個(gè)部分組成:
(AAA 、 BBB)
第一個(gè)元素AAA稱為car部分,剩下的另外一半。不管有多少,稱為cdr部分。也就是對(duì)稱的第二個(gè)元素。這叫con cell元素。很多復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如數(shù)組,hash表,紅黑樹,二叉樹都是由它實(shí)現(xiàn)的。你說(shuō)它不基礎(chǔ)?但是lisp又很高級(jí),c語(yǔ)言的一個(gè)特性是,機(jī)器效率雖高,但是人工效率很低。而lisp不同,《黑客與畫家》中指出,lisp只需要c語(yǔ)言十分之一的代碼就能實(shí)現(xiàn)同等的功能。而lisp甚至能直接操作cpu的寄存器,這是哪種高級(jí)虛擬機(jī)語(yǔ)言能實(shí)現(xiàn)的?
2、lisp很簡(jiǎn)潔,用一句話就能概括lisp的語(yǔ)法:
例如(A B C)
用圓括號(hào)括起來(lái)稱為一個(gè)列表,列表中第一個(gè)原子被視為函數(shù),其他原子被視為變量。而由單括號(hào)‘前導(dǎo)的元素什么也不視為(不求值),只按原樣返回。
完了,就這么簡(jiǎn)單。剩下的都是細(xì)節(jié)。要知道真理都是很簡(jiǎn)潔的,比如e=mc2,真理總結(jié)出來(lái)都這么簡(jiǎn)單。所以lisp很強(qiáng)。
用多數(shù)人可以理解的話說(shuō),lisp沒有”保留字“。我們知道每種語(yǔ)言包括c但是有保留字的。這意味著2點(diǎn):
(1)他們的處理語(yǔ)句和數(shù)據(jù)是分開的,不一樣的。
(2)他們都是被限制了的
但是lisp沒有保留字,為什么呢?你看多數(shù)語(yǔ)言像c++,Java根本就沒有所謂符號(hào)(symbol),ruby有符號(hào),但是應(yīng)用很少。lisp不同,lisp大多數(shù)原子都是符號(hào)。比如(print atom-1 atom-2),每一個(gè)符號(hào)可以連接著一個(gè)函數(shù)定義,或者一個(gè)變量定義,這個(gè)例子就是對(duì)atom-1,atom-2 兩個(gè)符號(hào)進(jìn)行求值,找出他們的變量定義然后交給print這個(gè)函數(shù)去運(yùn)算。你可以把它調(diào)過(guò)來(lái)。(atom-1 print atom-2) ,這個(gè)例子就是對(duì)print,atom-2 兩個(gè)符號(hào)進(jìn)行求值,找出他們的變量定義然后交給atom-1連接的函數(shù)去運(yùn)算,區(qū)別可能是print可能是一個(gè)系統(tǒng)預(yù)先定義好的函數(shù),而atom-1可能是用戶自定義函數(shù)。所以說(shuō)lisp是沒有保留字,也不需要保留字的。
所以我們就可以看到了,lisp一個(gè)有名的特點(diǎn),數(shù)據(jù)和語(yǔ)句是一樣的,是怎么實(shí)現(xiàn)的了。非常簡(jiǎn)單,同樣的東西,你把它放在列表第一個(gè),就是函數(shù),否則就是變量,如果加上單引號(hào)不求值,那就是數(shù)據(jù)。如此,lisp也可以實(shí)現(xiàn)非常強(qiáng)大的宏系統(tǒng),這也是獨(dú)一無(wú)二的,其他語(yǔ)言都不能,因?yàn)樗麄兌疾豢梢园褦?shù)據(jù)和語(yǔ)句區(qū)別開來(lái)。簡(jiǎn)單的說(shuō),宏就是接受一個(gè)參數(shù),然后返回對(duì)應(yīng)的代碼,插入到調(diào)用宏的位置
`(defun aaaaa(,args)
;; process ))
這樣的東西
把對(duì)應(yīng)的代碼恢復(fù)到對(duì)應(yīng)位置,只要求值,就和普通的代碼無(wú)異。所以lisp可以。而其他語(yǔ)言不可以。你返回一段語(yǔ)句,這段貨的數(shù)據(jù)類型是啥?它就是數(shù)據(jù),不是語(yǔ)句。要運(yùn)行它,eval它,然后只能得到一個(gè)結(jié)果(以我對(duì)ruby粗淺的了解,它已經(jīng)比java靈活太多了)。不像lisp可以替代源代碼中的一個(gè)部分,比如替代函數(shù)中的一部分,這段代碼可以操作參數(shù),其他語(yǔ)言可以么?
但是lisp這么強(qiáng)大,為什么1958年就被發(fā)明,半個(gè)世紀(jì)以來(lái),lisp沒有廣泛的應(yīng)用?
lisp并非沒有得到過(guò)應(yīng)用。在教學(xué)領(lǐng)域,lisp是一門非常廣泛使用的語(yǔ)言,那些不急功近利的學(xué)校比如麻省理工,入門課都采用schme(一門lisp的方言),而在商業(yè)領(lǐng)域,有名的《黑客與畫家》的作者P··G在創(chuàng)立世界第一家互聯(lián)網(wǎng)企業(yè)viaweb時(shí),使用的是lisp。lisp之所以沒有被廣泛應(yīng)用,是因?yàn)樗珡?qiáng)大了,這么說(shuō)似乎有點(diǎn)欠揍,但強(qiáng)大就意味著靈活,而靈活就意味著幾乎沒有語(yǔ)法。那些商業(yè)公司想要的只是穩(wěn)定,把工作完成,他們并不在乎你用什么語(yǔ)言開發(fā)。他們才恨不得每一行都是釘死的,所有人都用一個(gè)名字寫函數(shù),因?yàn)檫@樣可以花更少的錢維護(hù)。
ruby之父松本行宏曾這么說(shuō):
而lisp的問(wèn)題在于,只要你掌握了s表達(dá)式,想寫出什么樣的程序都行,這意味lisp是沒有語(yǔ)法的。這在應(yīng)用上帶來(lái)了一定的麻煩。我不希望自己的語(yǔ)言是沒有語(yǔ)法的。所以ruby加入了一定的語(yǔ)法限制。
而在程序員的角度來(lái)說(shuō),以我看來(lái),大多數(shù)人似乎不那么聰明,多數(shù)人喜歡用一種死語(yǔ)言(java/c++)也無(wú)可厚非,因?yàn)樗麄兊乃季S可能就是死的。lisp可能更適用于強(qiáng)大的黑客,自己或者少數(shù)人每個(gè)人都很強(qiáng)的類型,它是一種黑客語(yǔ)言,而不是一種商業(yè)語(yǔ)言。
綜上所述,lisp是靈活的,天馬行空的,沒有限制的。在我看來(lái),一旦使用lisp,就不會(huì)想在去使用其他語(yǔ)言。lisp有一種和諧的美。我認(rèn)為,F(xiàn)ortran,c++,java這樣的東西是應(yīng)需而生的,他們是為了滿足當(dāng)下的需要和硬件條件而設(shè)計(jì)使用的。而lisp從開始就是為了迎合真理和美而生。所以50年過(guò)去了,lisp還沒有過(guò)時(shí)。lisp就是計(jì)算機(jī)界的真理,記得漫畫《風(fēng)云》中有這么一句,因?yàn)椴还艿侥睦铮胬恚ɑ蛘呤穷愃频脑~)就是真理,所以絕世好劍的形狀在哪都是一樣的。lisp也是一樣。以后可能會(huì)出現(xiàn)別的名字的語(yǔ)言,也可能不叫l(wèi)isp,但是真理總是真理,所以絕世好劍的形狀總是一樣的。
但是從現(xiàn)實(shí)的角度來(lái)看,我們要編程,如何運(yùn)用lisp呢?
emacs使用emacs lisp作為架構(gòu)語(yǔ)言(不僅僅是擴(kuò)展語(yǔ)言),這是絕佳的學(xué)習(xí)lisp的途徑
common lisp和scheme作為lisp最有名的兩門方言,廣為人知。但是在教育領(lǐng)域應(yīng)用比較多。實(shí)際用途似乎比較少
GNU組織使用guile作為gnu通用擴(kuò)展語(yǔ)言,但是我沒聽說(shuō)哪有它的應(yīng)用。
時(shí)下最火的clojure,你可能聽說(shuō)過(guò),這是一種運(yùn)行在java虛擬機(jī)上的lisp,編譯為java字節(jié)碼,具有和java一樣的速度,使用它可以無(wú)縫使用jdk里的所有庫(kù)和java的無(wú)數(shù)第三方庫(kù),現(xiàn)在你知道它為啥火了。clojure的一個(gè)子集可以編譯為javaascript運(yùn)行在瀏覽器中,這帶來(lái)了無(wú)盡的可能,盡情的享受那些愚民們的成果吧,node.js貌似也行。
看法二:(不支持)
認(rèn)為L(zhǎng)isp永遠(yuǎn)成不了編程主流語(yǔ)言。他們認(rèn)為L(zhǎng)isp未能成為主流的根本原因是這一語(yǔ)言是反人性的,它的先進(jìn)是對(duì)于機(jī)器的先進(jìn),就像二進(jìn)制對(duì)于計(jì)算機(jī)來(lái)說(shuō)是先進(jìn)的一樣。人是生物,對(duì)事物的需求都有著多樣性的需求,人類的所有語(yǔ)言對(duì)漂亮的形容詞從來(lái)不止一個(gè),對(duì)顏色的要求從來(lái)就不止黑白亮色,所以在數(shù)字上選擇了十進(jìn)制而不選擇二進(jìn)制,這是最基本的人性。Lisp使用S表達(dá)式抹平了一切多樣性,禁止人類數(shù)千年來(lái)不約而同選擇的的A+B這樣的中綴表達(dá)式規(guī)則,違反了人性,所以受到了廣大開發(fā)者的不接受。
簡(jiǎn)單說(shuō)就是Lisp語(yǔ)言違反了人類人性中對(duì)事物多樣性的需求而不能成為編程語(yǔ)言中的主流。
lisp語(yǔ)言特點(diǎn)
LISP為函數(shù)式程序設(shè)計(jì)語(yǔ)言,所有運(yùn)算都能以函數(shù)作用于參數(shù)的方式來(lái)實(shí)現(xiàn)。
LISP沒有命令式語(yǔ)言程序中常見賦值語(yǔ)句和變量,重復(fù)的過(guò)程可以使用遞歸的函數(shù)調(diào)用來(lái)表示,并不需要使用循環(huán)模式。
LISP是古老的函數(shù)語(yǔ)言、弱類型、動(dòng)態(tài)推斷,其代碼本身就是各種列表。每一個(gè)表項(xiàng)均可以儲(chǔ)存任何類型的數(shù)據(jù)如數(shù)字、函數(shù)、符號(hào)或一個(gè)子表等,在編碼時(shí),可以隨時(shí)操作以更新列表。
LISP核心的操作符只有7個(gè)操作符:quote、atom、eq、car、cdr、cons、cond。前三者quote、atom、eq用于符號(hào)的推斷;car、cdr、cons操縱表格;cond負(fù)責(zé)分支判斷。這種簡(jiǎn)潔定義,非常接近圖靈機(jī)原型的純函數(shù)式語(yǔ)言,是現(xiàn)代語(yǔ)言完全無(wú)法比擬的。
LISP作為弱類型這優(yōu)點(diǎn)相對(duì)缺點(diǎn)則是運(yùn)行效率的低下。原始定義簡(jiǎn)潔的缺點(diǎn)使到大型開發(fā)工程變得困難,自底層到高層,自二維表查詢到面向?qū)ο螅褂谜咝枰度敫嗟暮瘮?shù)來(lái)實(shí)現(xiàn),致使LISP眾多方言的衍生。
Lisp優(yōu)勢(shì):
- 不尋常的語(yǔ)法對(duì)智商是一個(gè)過(guò)濾
- 語(yǔ)法糖特別適合對(duì)編輯器優(yōu)化, 語(yǔ)言本身并沒有給你任何不可跨越的限制。
- Emacs配置本來(lái)就是個(gè)人行為。代碼量不會(huì)很大,都放到同一個(gè)目錄下grep就行了。所以也不存在多人開發(fā)導(dǎo)致質(zhì)量下降的問(wèn)題。
評(píng)論