精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

超碰超碰在线观看| 日韩高清国产精品| 91久久国产视频| 蜜臀av免费一区二区三区| 在线视频一区二区免费| 特级毛片在线免费观看| 色婷婷av一区二区三区之e本道| 国产美女一区| 久久人人爽人人爽人人片亚洲| 国产欧美视频一区| 丁香婷婷久久| 午夜影院久久久| 日韩国产美国| 人妻丰满熟妇av无码区hd| 免费欧美在线视频| 97久久精品人人澡人人爽缅北| 久久久久亚洲av无码a片| 日韩区欧美区| 欧美少妇xxx| 欧美日韩在线一| 黄色动漫在线观看| 久久久精品影视| 成人午夜在线观看| 久久精品五月天| 好看的日韩av电影| 久久久999精品视频| 五级黄高潮片90分钟视频| 日韩成人精品| 欧美卡1卡2卡| 国产熟人av一二三区| 成人免费图片免费观看| 一区二区三区小说| 日韩av电影免费播放| 婷婷色在线观看| 成人免费av网站| 亚洲tv在线观看| 97人妻精品一区二区三区软件| 久久一区国产| 欧美激情一区二区三区高清视频| 国产探花在线视频| 日韩精品影视| 最近2019年日本中文免费字幕| v8888av| 精品国产影院| 精品国产免费视频| 青娱乐精品在线| 国产精品日本一区二区不卡视频| 欧美日韩国产欧美日美国产精品| 粉嫩虎白女毛片人体| 欧美激情20| 五月激情丁香一区二区三区| 福利在线一区二区| 青青草原国产在线| 亚洲综合在线观看视频| 女女同性女同一区二区三区按摩| 日本不卡不卡| 亚洲视频在线观看一区| 波多野结衣激情| 中文字幕免费高清电视剧网站在线观看| 国产精品伦理在线| 欧美aaa在线观看| 成年人黄视频在线观看| 最新国产成人在线观看| 色哟哟免费网站| 蜜臀av在线| 欧美性xxxxxxx| 一本久道综合色婷婷五月| 日本在线中文字幕一区二区三区| 91精品福利在线| 玖玖爱视频在线| 精品精品视频| 亚洲国产成人久久综合| 成人h动漫精品一区| 亚洲午夜久久| 日韩中文字在线| 久久久久久久9999| 裸体一区二区| 国产日韩欧美黄色| 丰满人妻一区二区三区四区53 | 亚洲人一二三区| 经典三级在线视频| 97人人爽人人澡人人精品| 懂色av中文一区二区三区天美| 熟妇人妻va精品中文字幕 | 美国黑人一级大黄| 久久久久久久久99精品大| 久久久久久久久久久亚洲| 一级片视频在线观看| 国产一区二区三区久久久| 国产美女在线精品免费观看| 久久久久久女乱国产| 亚洲欧美一区二区视频| 日韩a∨精品日韩在线观看| 忘忧草在线www成人影院| 日韩欧美你懂的| 男女黄床上色视频| 亚洲乱码精品| 国产成人啪精品视频免费网| 国产又黄又爽视频| 久久亚洲二区三区| 精品久久久无码人妻字幂| 天堂√8在线中文| 91精品视频网| 国产成人福利在线| 国产一区日韩欧美| 国产精品免费一区| 污视频在线免费| 国产精品国产自产拍高清av| 欧洲黄色一级视频| 免费精品一区| 中文字幕免费国产精品| 国产一级片免费观看| 日本在线不卡一区| 精品国产一区二区三区四区vr| 在线免费看黄| 日韩欧美亚洲一二三区| 国产大尺度视频| 99久久婷婷| 国产精品成人在线| 五月色婷婷综合| 亚洲黄色av一区| 怡红院亚洲色图| 综合综合综合综合综合网| 欧美老女人在线视频| 在线播放精品视频| 国产午夜精品一区二区三区视频 | 中文精品视频一区二区在线观看| 欧美私密网站| 亚洲精品一区二区三区精华液 | 亚洲精选在线| 亚洲综合av影视| 日本不卡不卡| 欧美日韩不卡在线| 色屁屁草草影院ccyy.com| 国产伦理一区| 久久综合色一本| 色资源二区在线视频| 亚洲第一精品夜夜躁人人爽| 中文字幕av播放| 国内精品自线一区二区三区视频| 亚洲精品一区二区三区四区五区| 五月天av在线| 亚洲毛片在线观看.| 国产婷婷色一区二区在线观看| 成人午夜精品在线| 成人精品视频在线播放| 亚洲国产欧美在线观看| 欧美激情综合色| 亚洲第一精品网站| 亚洲电影在线免费观看| 国产精久久久久| 亚洲每日更新| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲高清免费观看 | 免费日韩中文字幕| 国产一区二区电影在线观看| 国产成人精品日本亚洲| av在线女优影院| 欧美男生操女生| 青青草原免费观看| www.爱久久.com| 黄色片一级视频| 日韩精品中文字幕第1页| 成人黄色午夜影院| 免费不卡av| 精品视频在线播放| 最近中文字幕av| 中文字幕制服丝袜成人av| 三年中文在线观看免费大全中国| 一二三区不卡| 国产精品国产精品| 美女高潮在线观看| 中文国产成人精品| 成人1区2区3区| 舔着乳尖日韩一区| 久久美女免费视频| 国产乱人伦偷精品视频不卡| 免费一级特黄毛片| 国产成人三级| 亚洲一区二区免费| www视频在线观看| 一个人www欧美| 国产美女www爽爽爽视频| 亚洲国产sm捆绑调教视频| www.av天天| 国产99久久久久久免费看农村| 成年人网站免费视频| 欧美日韩一区二区三区视频播放| 91沈先生播放一区二区| 小早川怜子影音先锋在线观看| 少妇高潮 亚洲精品| 丰满人妻一区二区三区无码av| 色综合久久综合| 黄色片子在线观看| 久久亚洲综合色一区二区三区 | 国产精品亚洲人在线观看| 亚洲熟女乱色一区二区三区| 99精品综合| 久久天堂国产精品| 亚洲精品黑牛一区二区三区| 日本成人精品在线| 日韩123区| 在线观看亚洲视频| 天天射天天操天天干| 91精品国产91久久久久久一区二区| 天堂网一区二区三区| 亚洲男人的天堂在线aⅴ视频| 免费观看av网站| 国产suv精品一区二区三区| 超碰在线播放91| 一区二区国产在线观看| 国产精品88久久久久久妇女| 久久不卡国产精品一区二区| 国产精品久久波多野结衣| 欧美视频免费看| 国产精品com| 黄色漫画在线免费看| 欧美成人亚洲成人日韩成人| 91精品国产综合久久久久久豆腐| 亚洲第一网中文字幕| 国产激情视频在线播放| 欧美群妇大交群中文字幕| 黄色污污网站在线观看| 岛国av一区二区| 久久无码精品丰满人妻| 亚洲另类中文字| 亚洲色图日韩精品| 久久看人人爽人人| 韩国无码一区二区三区精品| 丁香桃色午夜亚洲一区二区三区| 欧美激情第3页| 日本视频一区二区| 成人黄色一区二区| 久久三级福利| av动漫免费看| 老司机精品福利视频| 国产美女网站在线观看| 亚洲黄色毛片| 国产真人做爰毛片视频直播| 欧美日韩伊人| 欧美激情亚洲天堂| 国产综合视频| 亚洲国产精品无码av| 亚洲成人中文| 国产特级黄色大片| 国产一区成人| 日韩av资源在线| 老司机午夜精品视频| 五月婷婷狠狠操| 男女激情视频一区| 亚洲男人天堂av在线| 国产一区二区三区四区五区入口 | 8x拔播拔播x8国产精品| 蜜桃视频动漫在线播放| 欧美亚洲国产日本| 2022成人影院| 国产女人18毛片水18精品| 亚洲成人1区| 999国内精品视频在线| 亚洲日本视频在线| 好看的日韩精品视频在线| 亚洲v天堂v手机在线| 欧美亚洲另类在线一区二区三区 | 综合国产在线视频| 看女生喷水的网站在线观看| 久久成年人视频| 第一中文字幕在线| 欧美一级在线播放| 78精品国产综合久久香蕉| 92福利视频午夜1000合集在线观看| 一区二区日韩| 免费久久久一本精品久久区| 残酷重口调教一区二区| 日本不卡一区二区三区四区| 亚洲成色精品| 亚洲黄色a v| 国产一区二区调教| 变态另类丨国产精品| 国产欧美视频在线观看| 欧美人禽zoz0强交| 精品日本美女福利在线观看| 久久人人爽人人爽人人片av免费| 欧美高清www午色夜在线视频| 亚洲风情第一页| 亚洲欧洲日韩国产| free性欧美hd另类精品| 91av在线免费观看| 亚洲日本免费电影| 久久国产精品亚洲va麻豆| 色综合天天爱| 一区二区传媒有限公司| 九一久久久久久| 黄色网址在线视频| 综合色中文字幕| 久久久精品视频网站 | 毛片在线能看| 久久在线精品视频| 超碰aⅴ人人做人人爽欧美| 成人免费观看a| 国产精品一区二区99| 天天做天天躁天天躁| 日韩av网站在线观看| 中文字幕天堂av| 国产精品久久久久久福利一牛影视| 久久久精品国产sm调教| 欧美色图片你懂的| 香蕉国产在线视频| 欧美日韩xxxxx| 久久久久毛片| 欧美日韩视频在线一区二区观看视频| 中文字幕亚洲精品乱码| 亚洲视频在线观看一区二区三区| 丁香另类激情小说| 亚洲熟女毛茸茸| 91传媒视频在线播放| 色香蕉在线视频| 欧美精品在线第一页| 粉嫩91精品久久久久久久99蜜桃| 国产在线精品一区二区三区| 欧美69视频| 911福利视频| 欧美极品aⅴ影院| 在线天堂中文字幕| 亚洲高清不卡av| 欧美色图天堂| 亚洲a一级视频| 欧美韩日一区| 欧美第一页浮力影院| 国产午夜精品在线观看| 少妇一级淫片免费放中国 | 在线亚洲一区二区| 日本人妖在线| 91成人天堂久久成人| 嫩草国产精品入口| 五十路熟女丰满大屁股| 大胆亚洲人体视频| 国产亚洲欧美久久久久| 欧美成人三级电影在线| 欧美xxx黑人xxx水蜜桃| 91视频99| 136国产福利精品导航网址| 亚洲乱妇老熟女爽到高潮的片| 一区二区三区毛片| 午夜免费福利视频| 久久久女人电视剧免费播放下载| 亚洲高清在线一区| 丰满少妇大力进入| 2欧美一区二区三区在线观看视频| 日韩精品视频播放| 日韩精品中文字幕视频在线| av资源亚洲| 日韩妆和欧美的一区二区| 日韩av在线播放中文字幕| 国产精品久久久久久久av| 欧美日韩中文字幕一区二区| 日本不卡在线| 成人一区二区三区四区| 亚洲精品精选| 成人精品999| 欧美男同性恋视频网站| 在线免费av导航| 国产精品中出一区二区三区| 国产精品三上| 日本综合在线观看| 日韩一区二区三区视频在线观看| 免费在线中文字幕| 噜噜噜噜噜久久久久久91| 青青草成人在线观看| 糖心vlog免费在线观看| 欧美变态口味重另类| 三级中文字幕在线观看| 亚洲成人一区二区三区| 国产一区二区调教| 五月激情六月丁香| 深夜福利国产精品| 在这里有精品| 欧美综合在线观看视频| 国产精品国产自产拍高清av| 亚洲免费不卡视频| 日本不卡免费高清视频| 亚洲不卡av不卡一区二区| 成人在线视频免费播放| 欧美日韩精品福利| 久草在线资源站资源站| 日韩精品久久一区| 成人性生交大片免费看中文网站 | 91精品啪在线观看国产60岁| а√天堂中文在线资源8| 亚洲福利av在线| 成人综合婷婷国产精品久久蜜臀| 久久久久99精品成人片我成大片| 久久九九国产精品怡红院| 巨人精品**| 日韩在线一区视频| 日本精品一区二区三区高清 | 永久免费在线观看视频| 国产成人成网站在线播放青青| 日日噜噜夜夜狠狠视频欧美人 | 国产又粗又猛又爽又黄av| 日韩欧美精品三级|