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 |