The limits of your languages are the limits of your world.
只會一種語言,會限制你的視野,很難有機會去接觸那些有趣的想法。
語言是表達思想的工具,而有想法的人未必用我們熟知的語言去表達。
所以,我們就不得不多學一些。
關于
本文是系列文章中的一篇,
在上一篇中,我們提到了著名的邏輯學家Haskell Curry,
提到了類型和函數,以及看待多元函數的不同方式。
最后,引出了curry和uncurry兩個高階函數。
為了理解高階函數,以及相關的,求值環境,詞法作用域,閉包等概念。
我們從今天起要學習一門新的語言了,用它來描述這些概念比較方便。
過幾天,當我們遇到參數化類型,代數數據類型的時候,
我們會再學一門語言。
括號神教
今天我們要學習的語言是Racket,它是Lisp家族中的一個語言。
Lisp,最初被拼為LISP,一個歷史悠久的編程語言家族。最早由約翰·麥卡錫在1958年基于λ演算創造,演化至今,是歷史第二悠久的高級語言,僅次于Fortran,也是第一個函數式編程語言。
約翰·麥卡錫
約翰·麥卡錫(John McCarthy,1927-2011),生于美國馬薩諸塞州波士頓,計算機科學家。他因在人工智能領域的貢獻而在1971年獲得圖靈獎。
他于1948年獲得加州理工學院數學學士學位,1951年獲得普林斯頓大學數學博士學位。分別短暫地為普林斯頓大學、斯坦福大學、達特茅斯學院和麻省理工學院供職后,麥卡錫于1962年-2000年底在斯坦福擔任教授,退休后成為名譽教授。
最美麗的傳說
在ILC 2002大會上前Lisp大神,當今的Python倡導者Peter Norvig,由于某些原因,做一個類似于馬丁路德在梵蒂岡宣揚新教的主題演講,因為他在演講中大膽地聲稱Python就是一種Lisp。
講完后進入提問環節,出乎我意料的是,Peter點了我過道另一側,靠上面幾排座位的一個老頭,他衣著皺褶,在演講剛開始的時候踱步進來,然后就靠在了那個座位上面。
這老頭滿頭凌亂的白發,邋遢的白胡須,像是從旅行團中落下的游客,已經完全迷路了,閑逛到這里來歇歇腳,隨便看看我們都在這里干什么。我的第一個念頭是,他會因為我們的奇怪的話題感到相當失望;接著,我意識到這位老頭的年紀,想到斯坦福就在附近,而且我想那人也在斯坦福 —— 難道他是……
“嗨,John,有什么問題?” Peter說。
雖然這只是10個字左右的問題,我不會假裝自己記住了Lisp之父約翰·麥卡錫說的每一個字。他在問Python程序能不能像處理數據一樣,優雅地處理Python代碼。
“不行。John, Python做不到。”
Peter就回答了這一句,然后靜靜地等待,準備接受教授的質疑,但老人沒有再說什么了。
此時,無語已勝千言。
Realm of Racket
Lisp家族
跟其他語言不同的是,Lisp語言是一個家族,它的成員被稱之為“方言”。
大部分方言都鮮有人知,例如Arc語言,由《黑客與畫家》的作者Paul Graham發明。
市面上流行的方言,包括以下幾個,
- Elisp,是Emacs編輯器支持的腳本語言,可以用elisp擴展Emacs的功能。由于lisp方言強大的表達能力,以及Emacs優雅的架構,讓Emacs獲得了“神之編輯器”的稱號。
- Clojure,運行在JVM上的另一種語言,Java是另一種。Clojure對并行和并發的支持,有自己的方式,在并發方面上,它沒有提供線程和鎖,而是提供了其他4種方式,Vars, Refs, Agents and Atoms。
- Common Lisp,是商業級的Lisp方言,規范長達1000多頁。有LispWorks,Allegro CL這些強大的IDE。Common Lisp不支持hygienic macro,在編寫宏的時候,容易出現意外的捕獲。不過,這也增加了靈活性和表現力。除此之外,Common Lisp還支持Reader macro,和Racket的#reader有異曲同工之妙。
- Scheme,是一門力求簡潔的Lisp方言,它首次提出了閉包的概念,提出了first-class continuation,提出了hygienic macro,然而它最新的R7RS規范包括最后的附錄才只有88頁。
DrRacket
Racket,原名PLT Scheme,在Scheme基礎上增加了對象、類型、惰性求值等。
它提供了一個IDE,成為Doctor Racket,簡稱DrRacket,自帶豐富的第三方庫,如web服務器、數據庫、GUI、圖像處理等。
我們可以通過Racket的官網,找到DrRacket的下載地址,可以找到多個平臺相應的安裝包,windows和linux,osx都支持。
安裝后,我們打開DrRacket,玩一下。
猶記得去年情人節,DrRacket還賣萌了一把,把圖標變成了心形。
打開后,IDE的界面如下,由上下兩部分構成,
上面那塊稱為定義區(definitions panel),下面稱為交互區(interactions panel)。
以上,就是標準的Hello world實現了,當然它不僅僅是個玩具哦。
參考:
LISP
約翰·麥卡錫
至今聽到關于Lisp最迷人的故事
Realm of Racket
The Racket Reference