Lisp 值得去學習嗎?
我覺得很值得,而且Lisp的解釋器很好實現,因此它不僅可以作為一種新思路學習,更可以作為學習編譯原理的材料,而且看SICP也需要Lisp,何樂而不為。
而且有些類型的人就是更容易理解Lisp思維,反而覺得Java風格的無法接受。比如我的一個朋友 @御坂黒子 ,他自稱學Java沒學懂,一看Lisp就懂了,從此入教。
再放一張我自己做的圖:
個人相關:學編譯原理之前寫過練手Lisp解釋器。
Lisp的價值在於最容易貫徹"Code as Data"這個編程範式
如果你要解決的問題是常見的、無需動態元編程的「靜態代碼」就能解決的問題,Lisp其實發揮不了什麼特殊作用。不如直接用那些「功能豐富又易上手」的常見語言(Python、Ruby、C++等)來做
但是如果你要解決的問題需要使用動態生成、轉化的代碼來解決,Lisp就是最好的工具之一
誠然,任何需要運行時改變、構造的代碼都可以通過參數化、鉤子化靜態代碼來代替,使之無須一個eval解釋器也能達到目的,但是那樣會極大地複雜化靜態代碼,所以複雜的情形下不如動態轉化代碼來的直觀
舉個例子:在常見的AOP場合(任何足夠複雜的項目都需要某種程度的AOP),使用不含eval的語言都顯得很累贅和蹩腳。要麼需要工具來「後期編織」源代碼、位元組碼、目標文件,要麼需要instrument、extend、hack運行時。如果使用Lisp,只需要轉化代碼(因為Code is Data),或者實現一個第二層的eval就行了謝左姐姐邀(喵
值得是值得。。。
現在絕大部分語言說到底也就還是 Lisp 那點東西(
有興趣不如看看麥卡錫的 Elephant 2000 (逃
在 ILC 2002 大會上前Lisp大神,
當今的Python倡導者Peter Norvig,由於某些原因,做一個類似於馬丁路德在梵蒂岡宣揚新教的主題演講,
因為他在演講中大膽地聲稱Python就是一種Lisp。
講完後進入提問環節,
出乎我意料的是,Peter點了我過道另一側,靠上面幾排座位的一個老頭,
他衣著皺褶,在演講剛開始的時候踱步進來,然後就靠在了那個座位上面。
這老頭滿頭凌亂的白髮,邋遢的白鬍須,像是從旅行團中落下的遊客,
已經完全迷路了,閑逛到這裡來歇歇腳,隨便看看我們都在這裡幹什麼。
我的第一個念頭是,他會因為我們的奇怪的話題感到相當失望;
接著,我意識到這位老頭的年紀,想到斯坦福就在附近,而且我想那人也在斯坦福 —— 難道他是……
「嗨,John,有什麼問題?」 Peter說。
雖然這只是10個字左右的問題,我不會假裝自己記住了Lisp之父約翰麥卡錫說的每一個字。
他在問Python程序能不能像處理數據一樣,優雅地處理Python代碼。
「不行。John, Python做不到。」
Peter就回答了這一句,然後靜靜地等待,準備接受教授的質疑,
但老人沒有再說什麼了。
此時,無語已勝千言。
Ooh! Ooh! My turn! Why Lisp?
我覺得可以看看自己是否符合下面的幾個條件的其中一個,如果符合就值得。
1. 想閱讀用Lisp家族的某個語言寫的軟體的源代碼;
2. 自己很有興趣或者有種懵懵懂懂的對Lisp這個名詞的憧憬;
3. 對宏感興趣;
4. 厭惡了C語法系的語言,想換個口味;
5. 為了看用Lisp家族的某個語言來當教學語言所寫出來的書,例如《PLAI》。
非常值得
當然要選 Lexical scoping 的,推薦 racket
引用 Eric S. Raymond 如何成為一名黑客 里的一句話
LISP值得學習的理由不同——最終掌握了它時你會得到豐富的啟迪和經驗。 這些經驗會使你在以後的日子裡成為一個更好的程序員,即使你實際上很少使用LISP本身。
如果你沒有學過一門函數式編程語言,那還是值得去學的,它代表了一種截然不同的編程思路。
是什麼讓Lisp語言如此先進?文章中說「面向對象程序設計中的 『模式』 有問題」
【如果你想解決一個困難的問題,關鍵不是你使用的語言是否強大,而是好幾個因素同時發揮作用(a)使用一種強大的語言,(b)為這個難題寫一 個事實上的解釋器,或者(c)你自己變成這個難題的人肉編譯器。在Python的例子中,這樣的處理方法已經開始出現了,我們實際上就是自己寫代碼,模擬 出編譯器實現局部變數的功能。
這種實踐不僅很普遍,而且已經制度化了。舉例來說,在面向對象編程的世界中,我們大量聽到"模式"(pattern)這個詞,我覺得那些" 模式"就是現實中的因素(c),也就是人肉編譯器。 當我在自己的程序中,發現用到了模式,我覺得這就表明某個地方出錯了。程序的形式,應該僅僅反映它所要解決的問題。代碼中其他任何外加的形式,都是一個信 號,(至少對我來說)表明我對問題的抽象還不夠深,也經常提醒我,自己正在手工完成的事情,本應該寫代碼,通過宏的擴展自動實現。】
大家怎麼理解?
小說值得看嗎?
冰與火之歌值得追嗎?
麗江值得逛嗎?
小蘋果那麼爛俗值得聽嗎?
有時候真的不需要考慮那麼多,每天拿出點時間來讀點小說or看集美劇or聽幾首歌,每周拿出點時間探索一種截然不同的編程方式,每月or每年去旅一次游。
你以為以上這些都毫無關係嗎?對於樂于思考的人以上每一件事都會讓你對人生有新的認識。
如果你只是想快速獲得一些就業市場的籌碼(or希望學完變大神 -.-! 顯然不可能)...對不起可能以上所有事情都是浪費時間。不如花點時間考個oracleDBA認證神馬的lisp的奇怪誤用,可以完美支持顏文字,噗~
小心副作用,例如我現在哪怕不用LISP了,開始用Mathematica了,也會自動在腦子裡把語句轉成括弧的形式。
LISP? 一生黑,沒商量。
去年我們學校有一門課 CZ3005 Artificial Intelligence, 前半學期的四個 lab assignments 必須要用 LISP 寫。其中一個 assignment 是寫一個 Knight"s Tour Puzzle Solver (Knights tour | Wikipedia).
本來挺簡單的東西,我先用 Java 寫了一個,不到兩小時就寫完了。但是,想拿分,交的版本就必須用 LISP,怎麼辦呢?我一邊讀 tutorial 一邊 google 想辦法用 LISP 重新寫一遍。
然後這才發現, LISP 真噁心。(具體為什麼噁心,參見後面轉載部分)
這個 LISP 起碼已經五十多歲了吧,比我爸歲數都大。當時1970s人們用它,是因為那個時候除了這個沒別的選了。可是五十多年過去了,新的語言一茬又一茬的長出來,到現在還要我們寫 LISP, 這不是有病么?
堅決不能忍。當時直接給我們學院寫了一封公開信,控訴強迫我們用 LISP 這一惡劣行徑。還別說,很有效果。下個學期,教這門課的教授就被換了,LISP 也從課程裡面去掉了。
=================
原文鏈接 - Why Do We Have to Use LISP?? | Nathaniel
Hi,
I am a student of CZ3005 Artificial Intelligence. I have a really simple question: WHY DO WE HAVE TO USE LISP?
This language is almost 60 years old. Yes, it was once popular among AI researchers like 30 years ago. But that was because back at that time, more advanced languages like Python or Ruby weren』t even born yet, and those people simply didn』t have any other choice than LISP.
But now, things are totally different. Although I wasn』t born in 1958, at least I can learn from history books about how much technologies have changed in the past half a century. So, why do we still have to learn LISP, a dead language that we won』t ever use again after these assignments, while there are much wiser options, like Python, Perl, or even C++.
Honestly, I didn』t even bother to look into the AIMS framework in LISP at all. A dead language is dead. I』d rather not waste my time on something that I will never use again in the industry. What I did instead was to spend slightly more than two hours writing a solver framework in Java and start translating my code to Lisp. Then, that』s where all the problems came in. Let me briefly summarize the problems I discovered when I was doing the translation:
1. LISP doesn』t have a powerful and convenient standard library as Java or Python does. Without the infrastructures like Set, Dictionary, Comparator, etc, the performance of the LISP program is like hundreds times slower compared to my Java code, although they implement exactly the same algorithm. Also this makes it so painful to write in Lisp.
2. The syntax is disgusting and the built-in function names just don』t make any sense. Although this might sound like personal preferences, I』d bet anyone who don』t hate themselves wouldn』t find the experience with Lisp entertaining.
3. The documentation quality is horrible, and there is no active developer community. I tried the official docs on Lisp Works, and the tutorial on TutorialsPoint.com. I also read some answers on stackoverflow related to Lisp. Well, they all suck. I still have too many things that I don』t understand in my mind and none of the materials really helped.
4. There is no convenient development environment. I』m sure you are familiar with IntelliJ IDEA and other well-known IDEs made by JetBrains such as PyCharm, WebStorm, RubyMine (This is not an advertisement; I just like their product). If you wanna take a look into the free tier, there are Eclipse, NetBeans, etc. BUT, is there one for Lisp? NO. Companies like JetBrains don』t make an IDE for Lisp for some reasons - most likely because no one actually uses LISP for serious stuff.
5. A large percentage of the libraries, frameworks, and references of the Google search results point to some 「.edu」 domain. Is it a sign that the undergrad level courses are too obsolete nowadays? Or seriously, how many researchers in AI still use Lisp for their daily research?
Well to address some points that might be used to defend the idea of using Lisp:
1. 「Lisp is not dead, there are many researchers using Lisp」 - Well, maybe it』s not completely dead, but its audiences are only limited to a few hobbyists, as well as those who started really early in programming but couldn』t follow up with fast-evolving technologies. It』s OK for the first group of people, because LISP reminds them of their good old days in college or as a young professional, but it』s stupid to be the second kind. People like that can』t survive in this industry.
2. 「University is about learning. It』s not just a training to prepare the students for the industry.」 - Yes that』s exactly the point. Does LISP facilitate our learning process in any way? Completely no, and even worse, it makes us hate learning whatever concept you are trying to teach us.
3. 「The language doesn』t matter. What we care is the concept, which is universal.」 - The language DOES matter, because our experience DOES matter, and our time DOES matter. We wouldn』t have to suffer so much, nor wouldn』t we have to spend so much time, if we』re allowed to use any advanced language like Python. Also, please, if the language really, as quoted, 「doesn』t matter」, why do you limit our choice to Lisp?
4. 「There is a AIMA framework in Lisp already」 - Yes there is, but the AIMA framework is also available in Java and Python. Also, the documentation of the LISP-version AIMA is so poor. I read about it, and I only understand roughly what it does, but got completely no idea how to use it. Or, what』s wrong with solving this problem from scratch? It』s not difficult at all if we use Python or Java.
OK, so far I』ve spent a whole day yesterday and the first 3 hours of Valentine』s Day converting my Java code into Lisp, and I finally made it work - not by learning from proper documentations, but being forced to do experiments on compiler and figure out the rules by myself. Btw, the word 「experiment」 doesn』t have to sound smart all the time. It』s really a stupid thing that you made us to do. Physicists and biologists do experiments because they are trying to figure out the rules set by Mother Nature and not documented by anyone before. If Mother Nature ever wrote a complete and proper documentation on the physics rules and parameters, it』d be stupid to do experiments ever again.
Also it』s not like I don』t have anything better to do on Valentine』s Day. Even assuming I didn』t have a girlfriend, I』d so like to try out Angular 2 (the front-end Javascript framework developed by Google), which has just been release in public Beta, if I didn』t have to spend so much time on the assignment.
Finally, in case you are interested, here』s the repository on GitHub that contains my solution in Java. I didn』t have the time to write documentation for it yet, but the code itself is quite easy to understand. It is extendable and provides a generic framework for this problem.
Thank you for reading this long email, and Happy Valentine』s Day!
Best regards
Nathaniel
作為程序員應該了解函數式編程。但是也沒有吹得那麼神乎其神。在lisp剛剛發明的1958年,它確實是獨一無二的。但是很多現代語言學習了lisp的很多特性,而在其他一些方面反而是lisp趕不上的。
在真實世界裡編程,並不需要理論上有多麼漂亮,重要的是多快好省的完成實際工作。有人把emacs和lisp的每一個邊邊角角的細節都搞得一清二楚,可是寫起程序來一個小時也完成不了我十分鐘完成的工作。這是我親身體驗。
編程語言的選擇很重要。在某些場合,lisp是可以提高生產力的工具。然而不應該忘記的是,編程最重要的是程序員。再好的語言也經不起糟糕的程序員折騰。某些人把它上升到宗教的高度。說穿了無非滿足一點自己的虛榮心罷了。用Lisp寫程序對產出代碼的深度比Python、Java等語言要高一些. 有些基礎性的代碼都需要自己寫, 或者網上找第三方的包管理程序, 所以感覺會比其他語言繁瑣. 而且寫Lisp程序要到信手拈來的水平需要很多精力跟時間. 習慣了靜態代碼編寫的同學再跳到元編程是會有點不習慣, 要是項目跟工作沒這個需要的話是不太有必要用Lisp. 估計很多學Lisp的同學們也只是出於興趣而已, 若是想用Lisp寫一個像樣的程序的話, 在國內這個大環境下不太現實、經濟. To sum up, LZ要是有興趣可以學, 要是為了某個項目或者對代碼產出要求比較高的話建議還是用其他語言哦.
lambda運算元最直接的體現就在lisp裡面。日常需要被編程的過程,大部分都可以被抽象成lambda運算元以簡化思維,這一點在面向對象和面向過程中也能發揮巨大的作用,尤其對於能夠被抽象成序列,向量,鏈表,樹一類的數據結構。這導致我在學lisp之後再寫python或者C++的時候會忍不住去用之前基本不用的lambda運算元,可是論壇上經常有人說it"s not pythonic,我只好攤手。我lisp用得少,平時刷刷演算法題,寫寫小插件提升性能而已。
不過說到性能,就不得不提到並行和分散式,下屬的一個map reduce的概念,這其實也是lisp常見的用法之一,可以說學習了lisp,理解了map reduce,再回到面向對象寫map reduce不僅印象深刻而且手到擒來。再比如MPI的一些routine,broadcast,gather,scatter等等,用lisp實現反而要更容易些。
我認為目前為止只有兩種真正乾淨利落, 始終如一的編程模式:C語言模式和Lisp語言模式.此二者就象兩座高地, 在它們 中間是尤如沼澤的低地.隨著計算機變得越來越強大,新開發的語言一直在堅定地 趨向於Lisp模式. 二十年來,開發新編程語言的一個流行的秘決是,取C語言的計 算模式,逐漸地往上加Lisp模式的特性,例如運行時類型和無用單元收集.
---------------------------原文鏈接 http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html
我覺得還是別學 LISP 了
數學學好就行了
學習Lisp對遞歸理解非常有幫助,可能在很多程序開發中,遞歸都是個很少用到的功能。
好好理解下宏+同像性+readtable。呵呵。我覺得需要智能計算的領域需要諸如prolog,lisp之類的語言。我現在自學MIT EECS網上課程。SICP部分對於我也僅僅是為了過這門課程而學習。當然過程中可以領lue不同程序語言的差異和編程思維。我嚮往google ITA 的工作(自己做個機票業務系統相關的項目)。但是能力不足。無法獲得這個機會。
推薦閱讀:
※零基礎如何學習 Web 安全?
※17 歲時你在幹什麼?
※如果在上海找一個適合 IT 圈內人聚會的咖啡館,地址選在哪裡比較好?有合適的推薦嗎?
※現在什麼瀏覽器比較好?
※生物信息分析專業換到 IT 行業可行么?