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