標籤:

走進 racket(lisp) 的世界

上周追著看了個大牛的好幾篇文章,發現一個叫racket的語言出鏡率頗高 —— 這已經是我十月來第三次從各種大牛的文章中接觸這個詞。就如「驚天魔盜團」里那個被催眠的法國人,當生活中多次出現和賭博相關的場景,Las Vegas自然而然成為他的下一個旅遊目的地。而racket,在上個周末,便成了我的Las Vegas。

我對編程語言的接觸大致分成三種「境界」:

  • 淺嘗輒止:了解一下語言設計的理念,基本功能,使用場景,寫寫一些基本的程序。如ruby,io,scala,clojure,object c,lua,haskell。

  • 愛不釋手:學習了全部語法,看作者編寫的書,遇到項目時會想想能不能用xxx實現,怎麼實現。如golang,erlang。

  • 日常使用:只要是需要寫代碼的地方,下手首先想到的就是TA。如python。當然,C也是我日常使用的語言,只不過C是工作語言而已。javascript大抵也能歸到此類,但也是迫於形勢。

從一開始看racket的文檔起,我就把它定位為一個「淺嘗輒止」的周末語言,因為有clojure的前車 —— 學會了基本的語法後便無法繼續深入 —— 我並未對自己深入了解racket有任何企盼。

racket是一個lisp [1] 家族的語言,祖上是common lisp [2] 對立的陣營scheme [3],起初為教學的目的而創立。

racket在osx/linux/windows下都有各自的安裝包,在其官網上下載安裝即可。racket自帶了一個有REPL功能的簡單的IDE DrRacket,方便初學者領略語言的魅力。同時,也提供了詳盡的在線文檔以及供初學者入門的 An Introduction to Racket with Pictures,和進階的 How to Design Programs。

這一切都不禁讓我想起十年前學習Python的場景:windows下的IDE + beginner』s guide + dive into python,何其相似!

為了進一步討好初學者,讓racket的學習寓教於樂,DrRacket可以直接和各種各樣的圖形圖片打交道,比如說這樣:

此外,racket的作者們還開發了一套htdp [4]庫,用於教學。比如你可以很方便地,幾行代碼完成一個火箭起飛的動畫,這是其它語言很難想像的。

初學racket,我自己是這麼一步步讀下來的:

  • 官網 An Introduction to Racket with Pictures

  • 第三方 Learn racket in Y Minutes - Learn X in Y Minutes

  • 電子書:How to design programs / Realm of Racket

  • 其它官方文檔

學了一個周末下來,發現自己對它已經到了愛不釋手的階段。我對racket的喜愛,有以下幾個原因:

首先,racket的文檔系統非常完備,為初學者考慮了幾乎一切可能。其所有文檔(包括社區里介紹racket的文檔)基本都是用racket撰寫的語言(或者說DSL)scribble所寫,統一度非常高,且代碼中所有出現的語法單元都會link到官方文檔的解釋頁面,讚不絕口啊!別看racket在程序員的滲透率非常低,其文檔的質量不輸於Python這樣的公眾情人!

其次,優秀的學習平台DrRacket。如今,一門語言如果沒有REPL,學習的曲線會高很多。racket在支持REPL的基礎上,還提供了一個可以調試的IDE。像lisp這樣能夠編寫macro的語言,如果無法調試macro,簡直就是一場災難,當時玩clojure進行不下去也是稍微複雜一點的macro總寫不對有關(我的功力實在有限),但DrRacket的 "Macro Stepper" 是個救星。此外,在DrRacket里,你還可以這麼寫代碼:

滿滿地都是愛啊!

再次,不得不說說scribble。這是racket自帶的文檔系統,同時也是racket設計出來的語言。如markdown,asciidoc一樣,scribble語言可以用來書寫文檔,並進一步被編譯成html,pdf等多種格式。和markdown等不同地是,在scribble里,你可以混入racket代碼,做各種各樣的事情:比如說在文檔中嵌入plot。由於程序君還沒有寫過複雜的基於scribble的文檔,所以無法說得更多。但是,單單看racket本身的文檔(全為scribble生成),就能感受到它的強大。

接下來是plot和slideshow。也許更深入地了解後我會寫篇「plot技術哪家強」的文章。在racket里,plotting直白地不能再直白了,你只需學一下racket的基本語法,就可以上手了,比python的matplotlib容易不少(當然,功能性還沒有太多比較,單看文檔,應該差不太多),比如一條 y=sin(x) 的曲線:

是不是很簡單?除了 sin 函數外,你只需要給出坐標系x軸的範圍 (- pi) pi,一切就OK了。再來一個:

由於racket的plot太過親民,使用它時我已經脫離了使用matplotlib那種非必要情況不去使用的「高級趣味」—— 我竟然在看plot文檔的過程中把初高中的基本公式都過了一遍!這真的很有意思,牆裂建議大伙兒試試。想想 z = (x + y)^2 這樣一個簡單的公式,一個年過三十的「老骨頭」,第一次一睹其三維圖的真面目,是怎樣一個淚奔的場景!

slideshow模塊可以讓你直接用racket寫slides。雖然我一直用markdown(最近改成了asciidoc)+ reveal.js的標配來寫slides,但racket的slideshow模塊絕對值得一試。

racket的其它優點,都或多或少跟lisp有關,這個我覺得自己不必多講。如果你看過「黑客與畫家」,就知道Paul Graham近乎偏執地把一切溢美之詞都給了lisp,說它是最有表現力的語言,說lisp是自己公司成功的"secret weapon"。對於lisp的優點,比如說一切皆為表達式,一切表達式皆可計算為一個值或一個list,語言可以在任何時候(讀取,編譯,執行)可用等等,可以看阮一峰的博文「為什麼Lisp語言如此先進」[5],這裡就不贅述。

我的racket之旅剛剛開始,希望這份熱情隨著自己對 define-syntax 的深入了解能夠繼續下去。等有了更多的心得後,在撰文表述。:)

如果您覺得這篇文章不錯,請點贊。多謝!

歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早8點與您相會。

1. LISt Processor的縮寫,基於λ演算創建,是一個函數式編程語言

2. 由於lisp語言過於靈活,很容易創建新的語言,所以其方言眾多,common lisp是統一lisp所做的努力之一

3. scheme是MIT引入的lisp的一種方言,遵循極簡主義,強調小的語言核心

4. how to design programs的縮寫

5. 為什麼Lisp語言如此先進?(譯文)
推薦閱讀:

寫作工具的取經之路
永恆不變的魅力
ps4和swich選擇哪個比較好?
拳皇14. 鐵拳7.街霸終極版,這三個PS4遊戲只能選一個的話如何抉擇?
全面對比 Xbox One 和 PS4,入手哪個更好?

TAG:迷思 | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 5 | 为什么Lisp语言如此先进?译文 |