標籤:

PLAI 編程環境簡單介紹

本文簡單介紹一下譯文 PLAI 中 Racket 集成開發環境界面和最基礎的 racket 語法。

強烈推薦 SICP ,有中文版。另外還有很多其他非常棒的書如 Friedman 的全系列(如 The little ... 系列)。

用戶界面

下載安裝後打開 Racket 其交互界面分成兩個部分,代碼編輯器窗口(後面簡稱編輯器)和解釋器窗口:

注意到編輯器中第一行默認被寫上了 #lang racket,表示當前使用 racket 語言(參見我的 譯文 中第一節)。

你可以在解釋器中直接輸入代碼執行,如下(GIF)

或者在編輯器中編輯代碼,點擊運行按鈕運行,如下(GIF)

PLAI 中使用的是 plai-typed 語言,這裡以它為例介紹一下如何安裝包,如圖,點擊 install package 後在輸入框中輸入 plai-typed 後點擊 install 後將自動從官方倉庫下載 plai-typed 安裝(或者命令行中輸入 raco pkg install plai-typed 回車進行安裝)。

一個常用配置,自動補全括弧,在配置(preference)中勾選如圖選項:

還有一些其他配置,有心的人可以大概瀏覽下配置菜單,按自己喜好勾選,如顯示行號這種。

還有對於括弧補全,可以安裝插件 paredit,雖然它沒有 emacs 的 paredit 功能完善,但是足夠使用。前面介紹了從官方倉庫安裝包的方法,有心的人可以看見在 install package 按鈕上面有個 install rkt,對於 paredit 你可以從其官方倉庫下載 paredit.rkt 後點擊該按鈕安裝後配置(死活沒找到配置菜單位置,直接食用後一種方式吧)。或者方面打開命令行輸入下面幾行命令安裝並配置該插件(什麼,你告訴我你不知道 git 是什麼?請出門左轉安裝。 raco 命令隨 racket 開發環境默認給我們安裝好了):

git clone git://github.com/yjqww6/drracket-paredit.gitnraco link drracket-pareditnraco setup drracket-pareditn

基本語法

Racket 屬於 Lisp 家族函數式程序設計語言,使用 s-expression 作為代碼表示,數據常用其表示。關於 s-expression,在網上可以可以搜到很多資料,這裡不做簡單介紹。

Racket 使用的是前綴表示法的 s-expression。下面簡單介紹一下其語法:

函數調用:

(+ 1 2) ;; 函數 +, 參數 1, 2n(* 2 3 4) ;; 函數 *, 參數 2 3 4nn(*n (+ 1 2)n (- 2 3))n;; 改成常用的中綴表達式是n;; ((1 + 2) * (2 - 3))n

使用 define 進行值綁定

(define x 10) ;; 符號 x 綁定到 10n(define y (* 2 3)) ;; 符號 y 綁定到 (* 2 3) 的結果n

使用 lambda 進行匿名函數聲明

;; 第一個表達式 lambdan;; 第二個表達式 參數列表n;; 後面是函數體,其中最後一個表達式的值作為函數返回值返回nn(lambda (x) (* x x))n;; 參數 x;返回 (* x x) 的值nn(lambda (x y)n (define k 10)n (* k x y))n;; 參數 x, yn;; 函數體首先定義了變數 kn;; 最後返回 (* k x y)n

匿名函數的調用,和上面介紹的加減乘除一樣,將函數作為第一項,後面依次傳入參數進行調用:

(n (lambda (x y)n (define k 10)n (* k x y))n 2n 3n)n;; 返回 60n

函數可以作為值使用 define 綁定到一個名字上

(define fn (lambda (x y)n (define k 10)n (* k x y)))n

對於函數定義提供了一個語法糖,上面的函數可以定義為

(define (f x y)n (define k 10)n (* k x y))n

if 控制流

(if n (= 1 1) ;; 第二部分為判斷語句,= 函數比較兩個值是否相等n "is true" ;; 如果判斷語句返回真值,if 第二部分作為 if 表達式的值返回n "is false" ;; 否則,if 第三部分作為 if 表達式的值返回n)n;; 該 if 表達式的返回值為字元串 "is true"n

使用遞歸定義個簡單低效的函數求第 n 個斐波那契數:

(define (fib n)n (if (= n 0)n 0n (if (= n 1)n 1n (+ (fib (- n 1))n (fib (- n 2)))n )))n

racket(sheme) 核心語法很少,這裡只介紹到了函數的定義與聲明就結束了,因為之後翻譯 PLAI 部分會介紹帶函數的解釋器。

關於 racket 語法更詳細的內容見官網文檔。之後如果有時間可能會更新這篇文章再稍微詳細介紹一點,但是如果有興趣建議找相關書籍閱讀。


推薦閱讀:

PLAI前6章回顧
Racket(Scheme)有哪些威力十足的庫?
Racket和Haskell誰更有發展潛力?
愉悅的scheme之旅(4)--Delimited Continuations

TAG:Racket |