精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Lisp已死,Lisp萬歲!

開發 后端 開發工具
有一句古話,叫做“國王已死,國王萬歲!”它的意思是,老國王已經死去,國王的兒子現在繼位。這句話的幽默,就在于這兩個“國王”其實指的不是同一個人,而你咋一看還以為它自相矛盾。今天我的話題仿效了這句話,叫做“Lisp 已死,Lisp 萬歲!”希望到最后你會明白這是什么意思。

有一句古話,叫做“國王已死,國王萬歲!”它的意思是,老國王已經死去,國王的兒子現在繼位。這句話的幽默,就在于這兩個“國王”其實指的不是同一個人,而你咋一看還以為它自相矛盾。今天我的話題仿效了這句話,叫做“Lisp 已死,Lisp 萬歲!”希望到***你會明白這是什么意思。

首先,我想總結一下 Lisp 的優點。你也許已經知道,Lisp 身上最重要的一些優點,其實已經“遺傳”到了幾乎每種流行的語言身上(Java,C#,JavaScript,Python, Ruby,Haskell,……)。由于我已經在其他博文里詳細的敘述過其中一些,所以現在只把這些 Lisp 的優點簡單列出來(關鍵部分加了鏈接):

  • Lisp 的語法是世界上最精煉,最美觀,也是語法分析起來***效的語法。這是 Lisp ***的,其他語言都沒有的優點。有些人喜歡設計看起來很炫的語法,其實都是自找麻煩。為什么這么說呢,請參考這篇《談語法》。

  • Lisp 是***個可以在程序的任何位置定義函數,并且可以把函數作為值傳遞的語言。這樣的設計使得它的表達能力非常強大。這種理念被 Python,JavaScript,Ruby 等語言所借鑒。

  • Lisp 有世界上***大的宏系統(macro system)。這種宏系統的表達力幾乎達到了理論所允許的極限。如果你只見過 C 語言的“宏”,那我可以告訴你它是完全沒法跟 Lisp 的宏系統相提并論的。

  • Lisp 是世界上***個使用垃圾回收(garbage collection)的語言。這種超前的理念,后來被 Java,C# 等語言借鑒。

想不到吧,現代語言的很多優點,其實都是來自于 Lisp — 世界上第二古老的程序語言。所以有人才會說,每一種現代語言都在朝著 Lisp 的方向“進化”。如果你相信了這話,也許就會疑惑,為什么 Lisp 今天沒有成為主流,為什么 Lisp Machine 會被 Unix 打敗。其實除了商業原因之外,還有技術上的問題

早期的 Lisp 其實普遍存在一個非常嚴重的問題:它使用 dynamic scoping。所謂 dynamic scoping 就是說,如果你的函數定義里面有“自由變量”,那么這個自由變量的值,會隨著函數的“調用位置”的不同而發生變化。

比如下面我定義一個函數 f,它接受一個參數 y,然后返回 x 和 y 的積。

  1. (setq f   
  2.       (let ((x 1))   
  3.         (lambda (y) (* x y)))) 

這里 x 對于函數 (lambda (y) (* x y)) 來說是個“自由變量”(free variable),因為它不是它的參數

看著這段代碼,你會很自然的認為,因為 x 的值是 1,那么 f 被調用的時候,結果應該等于 (* 1 y),也就是說應該等于 y 的值??墒沁@在 dynamic scoping 的語言里結果如何呢?我們來看看吧。

(你可以在 emacs 里面試驗以下的結果,因為 Emacs Lisp 使用的就是 dynamic scoping。)

如果我們在函數調用的外層定義一個 x,值為 2:

  1. (let ((x 2))  
  2.   (funcall f 2)) 

因為這個 x 跟 f 定義處的 x 的作用域不同,所以它們不應該互相干擾。所以我們應該得到 2??墒?,這段代碼返回的結果卻為 4。

再來。我們另外定義一個 x,值為 3:

  1. (let ((x 3))  
  2.   (funcall f 2)) 

我們的期望值還是 2,可是結果卻是 6。

再來。如果我們直接調用:

  1. (funcall f 2) 

你想這次總該得到 2 了吧?結果,出錯了:

  1. Debugger entered--Lisp error: (void-variable x)  
  2.   (* x y)  
  3.   (lambda (y) (* x y))(2)  
  4.   funcall((lambda (y) (* x y)) 2)  
  5.   eval_r((funcall f 2) nil)  
  6.   eval-last-sexp-1(nil)  
  7.   eval-last-sexp(nil)  
  8.   call-interactively(eval-last-sexp nil nil) 

看到問題了嗎?f 的行為,隨著調用位置的一個“名叫 x”的變量的值而發生變化。而這個 x,跟 f 定義處的 x 其實根本就不是同一個變量,它們只不過名字相同而已。這會導致非常難以發現的錯誤,也就是早期的 Lisp 最令人頭痛的地方。我的老師 Dan Friedman 當年就為此痛苦了很多年,直到 Scheme 的出現,他才歡呼道:“終于有人把它給做對了!”

(附帶說一句,Scheme 不是 Dan Friedman 發明的,而是 Guy Steele 和 Gerald Sussman。然而,Friedman 對程序語言的本質理解,其實超越了 Lisp 的范疇,并且對 Scheme 的后期設計做出了重要的貢獻。以至于 Sussman 在 Friedman 的 60 大壽時發表演說,戲稱自己比起 Friedman 來,“只是 Scheme 的用戶”。)

好在現在的大部分語言其實已經吸取了這個教訓,所以你不再會遇到這種讓人發瘋的痛苦。不管是 Scheme, Common Lisp, Haskell, OCaml, Python, JavaScript…… 都不使用 dynamic scoping。

那現在也許你了解了,什么是讓人深惡痛絕的 dynamic scoping。如果我告訴你,Lisp Machine 所使用的語言 ZetaLisp(也叫 Lisp Machine Lisp)使用的也是 dynamic scoping,你也許就明白了為什么 Lisp Machine 會失敗。因為它跟現在的 Common Lisp 和 Scheme,真的是天壤之別。我寧愿寫 C++,Java 或者 Python,也不愿意寫 ZetaLisp 或者 Emacs Lisp。

話說回來,為什么早期的 Lisp 會使用 dynamic scoping 呢?其實這根本就不是一個有意的“設計”,而是一個無意的“巧合”。你幾乎什么都不用做,它就成那個樣子了。這不是開玩笑,如果你在 emacs 里面顯示 f 的值,它會打印出:

  1. '(lambda (y) (* x y)) 

這說明 f 的值其實是一個 S 表達式,而不是像 Scheme 一樣的“閉包”(closure)。原來,Emacs Lisp 直接把函數定義處的 S 表達式 ‘(lambda (y) (* x y)) 作為了函數的“值”,這是一種很幼稚的做法。如果你是***次實現函數式語言的新手,很有可能就會這樣做。Lisp 的設計者當年也是這樣的情況。

簡單倒是簡單,麻煩事接著就來了。調用 f 的時候,比如 (funcall f 2),y 的值當然來自參數 2,可是 x 的值是多少呢?答案是:不知道!不知道怎么辦?到“外層環境”去找唄,看到哪個就用哪個,看不到就報錯。所以你就看到了之前出現的現象,函數的行為隨著一個完全無關的變量而變化。如果你單獨調用 (funcall f 2) 就會因為找不到 x 的值而出錯。

那么正確的實現函數的做法是什么呢?是制造“閉包”(closure)。這也就是 Scheme,Common Lisp 以及 Python,C# 的做法。在函數定義被解釋或者編譯的時候,當時的自由變量(比如 x)的值,會跟函數的代碼綁在一起,被放進一種叫做“閉包”的結構里。比如上面的函數,就可以表示成這個樣子:(Closure '(lambda (y) (* x y)) '((x . 1)))。

在這里我用 (Closure ...) 表示一個“結構”(就像 C 語言的 struct)。它的***個部分,是這個函數的定義。第二個部分是 '((x . 1)),它是一個“環境”,其實就是一個從變量到值的映射(map)。利用這個映射,我們記住函數定義處的那個 x 的值,而不是在調用的時候才去瞎找。

我不想在這里深入細節。如果你對實現語言感興趣的話,可以參考我的另一篇博文《怎樣寫一個解釋器》。它教你如何實現一個正確的,沒有以上毛病的解釋器。

與 dynamic scoping 相對的就是“lexical scoping”。我剛才告訴你的閉包,就是 lexical scoping 的實現方法。***個實現 lexical scoping 的語言,其實不是 Lisp 家族的,而是 Algol 60。“Algol”之所以叫這名字,是因為它的設計初衷是用來實現算法(algorithm)。其實 Algol 比起 Lisp 有很多不足,但在 lexical scoping 這一點上它卻做對了。Scheme 從 Algol 60 身上學到了 lexical scoping,成為了***個使用 lexical scoping 的“Lisp 方言”。9 年之后,Lisp 家族的“集大成者” Common Lisp 誕生了,它也采用了 lexical scoping??磥碛⑿鬯娐酝?。

你也許發現了,Lisp 其實不是一種語言,而是很多種語言。這些被人叫做“Lisp 家族”的語言,其實共同點只是它們的“語法”:它們都是基于 S 表達式。如果你因此對它們同樣贊美的話,那么你贊美的其實只是 S 表達式,而不是這些語言本身。因為一個語言的本質應該是由它的語義決定的,而跟語法沒有很大關系。你甚至可以給同一種語言設計多種不同的語法,而不改變這語言的本質。比如,我曾經給 TeX 設計了 Lisp 的語法,我把它叫做 SchTeX(Scheme + TeX)。SchTeX 的文件看起來是這個樣子:

  1. (documentclass article (11pt))  
  2.  
  3. (document  
  4.  
  5.   (abstract (...))  
  6.  
  7.   (section (First Section)  
  8.  
  9.       ... )  
  10.  
  11.   (section (Second Section)  
  12.  
  13.       ... )  
  14.  

很明顯,雖然這看起來像是 Scheme,本質卻仍然是 TeX。

所以,因為 Scheme 的語法使用 S 表達式,就把 Scheme 叫做 Lisp 的“方言”,其實是不大準確的做法。Scheme 和 Emacs Lisp,Common Lisp 其實是三種不同的語言。Racket 曾經叫做 PLT Scheme,但是它跟 Scheme 的區別日益增加,以至于現在 PLT 把它改名叫 Racket。這是有他們的道理的。

所以,你也許明白了為什么這篇文章的標題叫做“Lisp 已死,Lisp 萬歲!” 因為這句話里面的兩個 “Lisp”其實是完全不同的語言。“Lisp 已死”,其實是說 ZetaLisp 這樣的 Lisp,由于嚴重的設計問題,已經死去。而“Lisp 萬歲”,是說像 Scheme,Common Lisp 這樣的 Lisp,還會繼續存在。它們先進于其它語言的地方,也會更多的被借鑒,被發揚廣大。

(其實老 Lisp 的死去還有另外一個重要的原因,那就是因為早期的 Lisp 編譯器生成的代碼效率非常低下。這個問題我留到下一篇博文再講。)

原文鏈接:http://blog.sina.com.cn/s/blog_5d90e82f0101jo6r.html

責任編輯:林師授 來源: 王垠的博客
相關推薦

2010-04-06 09:02:59

Solaris甲骨文Sun

2013-02-26 11:01:42

CIO信息化大數據云計算

2019-10-11 08:58:21

Hadoop開源

2015-04-23 09:34:18

CoffeeScripJavaScript開

2024-10-15 11:16:18

2024-12-10 09:07:17

2015-11-05 10:17:42

網絡工程師IT人員

2018-01-08 07:58:51

深度學習編程人工智能

2025-01-13 08:20:00

AI模型訓練

2012-06-04 10:34:17

Lisp

2009-09-03 18:32:43

Lisp函數

2017-03-16 09:30:56

LispAI數據結構

2017-01-05 13:31:33

Lisp加法運算

2012-11-22 10:11:16

LispLisp教程

2011-04-15 09:23:33

IETFLISP路由器

2014-12-24 13:53:48

2011-10-14 09:20:48

Lisp

2013-03-18 09:30:18

Lisp

2010-10-15 10:35:18

2015-05-20 09:05:40

點贊
收藏

51CTO技術棧公眾號

国产蜜臀97一区二区三区 | 国产最新精品视频| 国产精品久久中文字幕| 中文字幕 自拍偷拍| 精品久久对白| 亚洲视频网在线直播| 国产成人精品一区二区| 制服.丝袜.亚洲.中文.综合懂| 黄网在线观看| 亚洲精品偷拍| 日韩视频国产视频| 亚洲图色在线| 欧美日韩在线视频播放| 日韩精品欧美大片| 亚洲成人一二三| 91在线国产电影| 日本裸体美女视频| 综合在线影院| 久久九九影视网| 国产91精品久久久| 大地资源二中文在线影视观看| 成年人网站在线| 久久99国产精品久久| 国产亚洲欧美一区| 狠狠热免费视频| 六十路在线观看| 免费看的黄色欧美网站| 日韩电影免费观看中文字幕| 国产婷婷一区二区三区| 人妻少妇精品无码专区| 一区视频在线| 日韩成人高清在线| 日韩黄色片视频| 色视频在线观看| 老司机午夜精品视频在线观看| 日韩国产精品一区| 国产精品欧美激情在线观看| 日本韩国一区| 日本成人在线视频网站| 综合国产在线视频| 肉色超薄丝袜脚交| 污污的视频在线观看| 国产91富婆露脸刺激对白| 欧美精品18videos性欧| 男人的天堂影院| 伊人久久综合一区二区| 久久精品视频一区| 国产精品影片在线观看| 97在线观看免费高| 99久久免费精品国产72精品九九| 亚洲电影一级黄| 精品国产综合久久| 午夜一区二区三区四区| 永久91嫩草亚洲精品人人| 亚洲电影免费观看高清| 久热免费在线观看| 日本蜜桃在线观看| 高清不卡一区二区在线| 日韩av片电影专区| 国内毛片毛片毛片毛片毛片| 亚洲午夜免费| 色av一区二区| 一级特黄妇女高潮| 蜜桃视频污在线观看| 久久国产精品久久久久久电车| 亚洲一区二区久久| aaaaaaaa毛片| 涩涩涩视频在线观看| 亚洲国产精品成人综合| 亚洲综合大片69999| 五月婷婷中文字幕| 久久国产成人午夜av影院宅| 欧美va亚洲va国产综合| 日韩手机在线观看视频| 69成人在线| 久久尤物电影视频在线观看| 成人看片人aa| 毛片基地在线观看| 自拍日韩欧美| 一区二区三区视频在线| 亚洲欧洲国产视频| 亚洲www啪成人一区二区| 亚洲香肠在线观看| 在线国产伦理一区| 天堂av在线资源| 国产成人免费视频网站 | 日韩欧美看国产| 亚洲九九爱视频| 欧美日韩一区二区三区在线视频| a天堂视频在线| 日本中文在线一区| 国内精品400部情侣激情| 久久午夜精品视频| 日韩最新在线| 欧美不卡一二三| 日韩中文字幕a| 不卡av影片| 亚洲国产欧美在线| 天天爱天天做天天操| 国产私拍精品| 99久久精品免费看| 成人18视频| 国产精品无码专区av免费播放| 亚洲免费在线| 91成人性视频| 国产大片中文字幕| 91精品亚洲| 中文字幕亚洲欧美日韩2019| 亚洲第一成人网站| 日韩欧美国产大片| 亚洲国产精品久久91精品| 性生活一级大片| 高清国产一区二区三区四区五区| 欧美网站大全在线观看| 热久久精品免费视频| 中文字幕21页在线看| 午夜久久久影院| 欧美黄网在线观看| 日韩伦理av| 亚洲综合免费观看高清完整版 | 黄色av电影网站| 欧州一区二区三区| 5858s免费视频成人| 欧美女同在线观看| 四虎国产精品免费久久| 欧美区一区二区三区| 天天干天天综合| 久久亚洲人体| 7777精品伊人久久久大香线蕉最新版| 国产又黄又猛又粗| 99er精品视频| 欧美一区在线视频| 性一交一黄一片| 99re91这里只有精品| 精品久久久久久久久久久久包黑料| 两女双腿交缠激烈磨豆腐| 欧美日本三级| 精品乱码亚洲一区二区不卡| 国产精品果冻传媒| 在线亚洲a色| 一区二区三区动漫| 精品国产精品国产精品| 国产精品久久| 欧美中文字幕在线观看| www.欧美色| 免费观看久久久4p| 亚洲www视频| 天天干,夜夜操| 国产亚洲欧美日韩在线一区| 亚洲.欧美.日本.国产综合在线| 亚洲搞黄视频| 亚洲国产精品综合小说图片区| 日本韩国欧美在线观看| 成人mm视频在线观看| 91精品国产综合久久福利| 国产精品成人免费一区久久羞羞| 亚洲v天堂v手机在线| 日韩中文字幕国产精品| 免费一级特黄特色大片| 久久蜜桃精品| 亚洲已满18点击进入在线看片| 丰满岳乱妇国产精品一区| 久久久久亚洲蜜桃| 裸体大乳女做爰69| 亚洲欧美韩国| 欧美一区二区三区四区久久| 亚洲天堂成人av| 外国成人免费视频| 26uuu国产精品视频| 91极品身材尤物theporn| 成人免费视频一区二区| 日韩一区不卡| 91九色在线看| 欧美日韩你懂的| 五月开心播播网| 婷婷久久综合| 日韩av123| 午夜精品无码一区二区三区| 亚洲国产精品成人综合| 91成人在线观看喷潮教学| 四虎地址8848精品| 亚洲区在线播放| 久草国产在线视频| 奇米一区二区三区| 精品一区二区视频| 午夜影院免费在线| 欧美日韩一区小说| 欧美性xxxx图片| 国内精品福利| 91在线免费观看网站| 成人在线视频成人| 欧美日韩免费在线观看| ass极品水嫩小美女ass| 久久亚洲国产| 国产精品久久久久久久9999 | 成人私拍视频| 精品国产一区二区精华| 国产精品久久国产精麻豆96堂| 久久精品一区| 久中文字幕一区| av老司机在线观看| 日韩亚洲欧美成人一区| 一级片一级片一级片| 日本不卡免费在线视频| 欧美成ee人免费视频| 97人澡人人添人人爽欧美| 日韩欧美国产综合一区| 日韩欧美国产成人精品免费| 蜜桃视频第一区免费观看| 欧洲高清一区二区| 欧美日韩视频网站| 亚洲男人天堂久| 一二三区免费视频| 久久精品日韩一区二区三区| 国产日产欧美视频| 亚洲精品aaaaa| 青青草原成人在线视频| 日本福利午夜视频在线| 一本大道久久a久久精品综合| 亚洲成人av免费在线观看| 999亚洲国产精| 国产精品制服诱惑| 国产直播在线| 精品调教chinesegay| 国产精品第九页| 波多野结衣中文一区| 加勒比成人在线| 欧美sss在线视频| 国外视频精品毛片| 性感美女一级片| 色综合天天天天做夜夜夜夜做| 亚洲一区二区观看| 日韩成人免费电影| 黄频视频在线观看| 久久天堂久久| 欧美极品xxxx| 亚洲欧美综合在线观看| 色婷婷av一区二区| 国产aaaaaaaaa| 韩国毛片一区二区三区| 国产一级做a爰片久久毛片男| 成人h动漫精品一区二区器材| 国产69精品久久久| 久热av在线| 欧美人动与zoxxxx乱| 久久婷婷一区二区| 91美女在线观看| 在线观看免费黄网站| 亚洲久久久久| 国产一级精品aaaaa看| 春暖花开亚洲一区二区三区| 久久精品人人做人人爽| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 91久久久免费一区二区| 韩国一级黄色录像| 成人免费高清在线| 亚洲一二三区av| 欧美1级日本1级| 九九热久久66| 亚洲一区二区av| 久久久综合免费视频| 川上优的av在线一区二区| 日韩一区二区不卡| 一级黄色av片| 亚洲伊人伊色伊影伊综合网| 加勒比综合在线| 粉嫩高潮美女一区二区三区| 日韩在线第三页| 欧美国产综合| 日本免费高清不卡| 77成人影视| 国产精品中文字幕在线| 黄色漫画在线免费看| 另类美女黄大片| 国产福利片在线| 精品国产1区2区3区| 亚洲一二区视频| 日韩人体视频一二区| 在线观看成人毛片| 中文字幕乱码一区二区免费| 老司机免费视频| 黄网站免费久久| 黄色片视频在线播放| 欧美精品国产一区二区| 亚洲一区二区自拍偷拍| 日韩美女毛片| 国产日韩欧美亚洲一区| 国产人与zoxxxx另类91| 国产精品日韩精品| 亚洲日本天堂| 性色av一区二区三区免费| 99热国产在线中文| 日韩一区二区在线视频| 国产一级免费在线观看| 日韩精品亚洲视频| 日本激情视频网站| 日韩精品一区二区三区蜜臀| 一级黄色片在线观看| 色视频一区二区| 精品成人av一区二区在线播放| 亚洲精品日韩一| 翔田千里88av中文字幕| 中文字幕亚洲不卡| 亚洲精品天堂网| 97香蕉碰碰人妻国产欧美| 丁香亚洲综合激情啪啪综合| a级大片免费看| 国产一二精品视频| 日韩欧美亚洲另类| 九九九久久久精品| 国产成人在线综合| 极品销魂美女一区二区三区| 手机av在线免费| 精品一区二区三区在线观看国产| 奇米视频7777| 狠狠色丁香久久婷婷综| 久久6免费视频| 国产一区福利在线| 视频免费1区二区三区| 久久国产精品第一页| 中文字幕在线观看日| 国产做a爰片久久毛片| 在线观看中文av| 国产精品99久久久| 少妇熟女视频一区二区三区| 成人av在线观| 国产又粗又猛又色| 久久无码av三级| 中文天堂资源在线| 综合av第一页| 精品99久久久久成人网站免费| 亚洲国产一区二区三区青草影视| 日本一区二区三区四区五区| 五月婷婷激情综合| 中文字幕一区在线播放| 在线免费观看日本欧美| 亚洲综合网av| 日韩欧美电影在线| 午夜av免费在线观看| 亚洲一区二区国产| 国产素人视频在线观看| 久久久欧美精品| 综合在线影院| 91嫩草在线视频| 加勒比色老久久爱综合网| 乱一区二区三区在线播放| 第一sis亚洲原创| 51xx午夜影福利| 久久免费国产| 色婷婷一区二区三区在线观看| 成人激情av网| 成人做爰69片免网站| 亚洲黄色在线视频| 亚洲永久精品在线观看| 欧美日韩国产系列| 亚洲免费黄色片| 一区二区国产精品视频| 欧洲成人综合网| 国产精品高潮在线| 香蕉免费一区二区三区在线观看 | 成年人免费大片| 国产麻豆精品theporn| 亚洲自拍偷拍一区二区| 成人免费在线播放视频| 免费在线观看黄网站| 欧美高清视频在线高清观看mv色露露十八| 亚洲国产中文字幕在线| 在线成人中文字幕| 国产丝袜在线播放| 国产精品电影在线观看| 国产精品1luya在线播放| 亚洲欧美国产精品桃花| 精品动漫3d一区二区三区免费| jizz大全欧美jizzcom| 波多野结衣中文字幕一区| 久久国产精品国语对白| 91极品视觉盛宴| 日韩一级片免费观看| yellow中文字幕久久| 日韩伦理三区| 精品国产免费久久久久久尖叫| 亚洲破处大片| 狠狠躁狠狠躁视频专区| 91丨九色丨尤物| 久久精品国产亚洲av麻豆色欲| 欧美日韩一区二区三区视频| 天堂v视频永久在线播放| 欧美黄色免费网站| 亚洲免费一区| 图片区小说区区亚洲五月| 99热免费精品在线观看| 伦伦影院午夜理论片| 国产精品蜜臀av| 亚洲图片欧美日韩| 日韩理论片久久| 麻豆mv在线观看| 精品久久中出| 亚洲国产三级| 深夜视频在线观看| 一区二区免费在线|