Racket
Racket(原名 PLT Scheme[10][11])是個通用、多範型,屬於Lisp家族的函數式程式設計語言,它的設計目之一是為了提供一種用於創造設計與實作其它程式語言的平台,Racket被用於指令碼程式設計、通用程式設計、電腦科學教育和學術研究等不同領域。
編程範型 | 多範式: 函數式, 反射式, 元程式設計, 面向語言, 物件導向, 程序式, 模組化, 邏輯式 |
---|---|
語言家族 | Lisp/Scheme |
實作者 | PLT Inc. |
面市時間 | 1995年 |
目前版本 |
|
型態系統 | 動態型別, 強型別, 靜態型別 |
系統平台 | x86, PowerPC, SPARC, MIPS, ARM |
作業系統 | 跨平台 |
許可證 | LGPL |
副檔名 | .rkt , .rktl , .rktd , .scrbl , .plt , .ss , .scm |
網站 | racket-lang |
衍生副語言 | |
Typed Racket[2], Lazy Racket[3], Scribble[4], FrTime[5] | |
啟發語言 | |
Scheme, Eiffel[6] | |
影響語言 | |
Clojure[7]、Rust、Scheme[8] |
Racket有一個實作平台,包含了執行環境、函式庫、即時編譯器(JIT compiler)等等,還有提供一個以Racket本身寫成的開發環境 DrRacket[12] (原名 DrScheme)。
Racket平台的發行版本是免費且開放原始碼的,以GNU寬通用公共許可證授權發行,所有由社群所編寫的擴充功能和套件都會被上傳到 PLaneT(一個網頁套件發佈系統)。
基於 Racket 實現的 Scribble 可以用來構建HTML或PDF(依賴 LaTeX),Racket 官方文件就是基於這個語言來編寫的。
開發原則
Racket的開發基於以下原則:[13]
- 程式語言的目的是表述和解決問題,這一過程通常在特定的情境中發生,該情境有一定的描述語言,因此Racket應該是能夠創製新程式語言的程式語言;
- 基於上述的表述問題的方式,問題系統可視為多語言的相互聯絡的組件的集合,Racket應當能夠提供足夠的保護機制,允許實現各種語言的完整特性;
- 與問題解決相關的在語言之外的機制,如專案和資源的管理,也可被Racket轉換為語言構造。
歷史
開發
Matthias Felleisen在1990年代中期建立了PLT,一開始為一個研究團隊,不久後逐漸投入程式設計師入門教材的專案開發。
在1995年1月,這個團隊決定開發一個建立在 Scheme函數式程式語言上的教學用程式語言環境,Mattew Flatt 簡單的從 libscheme 中將 MrEd (Racket 的原始虛擬機器)、wxWidgets 與一些其他的免費系統結合,接下來的幾年內,由 Flatt、Robby Findler、Shriram Krishnamurthi、Cormac Flanagan 和其他許多人組成的團隊推出了 DrScheme,一個給 Scheme 程式設計新手的程式設計環境,也作為弱型別程式語言的研究環境,當時 DrScheme 主要支援的程式語言叫做 PLT Scheme。
在此同時,該團隊也開始為中學教師開設研習課程,教授他們學習程式設計與函數式程式設計,這些老師和他們的學生所做的現場測試提供了團對專案開發方向重要的依據,在接下來的幾年中,PLT 團隊為 DrScheme 加入了教學用語言,例如 代數步進器[14]、讀取-求值-輸出循環、constructor-based printer 和其他許多發明,推出了一套有應用價值的程式教學環境。
2001年,核心團隊(Felleisen, Findler, Flatt, Krishnamurthi)也編纂和發行了他們的第一本教科書《程式設計方法》,融入了許多他們的教學理念。
在2010年6月7日, PLT Scheme被重新命名為Racket[15]。
代碼範例
楊輝三角形(代碼來自:rosettacode):
#lang racket
(define (next-row row)
(map + (cons 0 row) (append row '(0))))
(define (triangle row rows)
(if (= rows 0)
'()
(cons row (triangle (next-row row) (- rows 1)))))
(triangle (list 1) 5)
運行後顯示
- '((1) (1 1) (1 2 1) (1 3 3 1) (1 4 6 4 1))
繪製迭代8次的 謝爾賓斯基三角形 (代碼來自:Racket 官網):
#lang racket
(require 2htdp/image)
(let sierpinski ([n 8])
(if (zero? n)
(triangle 2 'solid 'red)
(let ([t (sierpinski (- n 1))])
(freeze (above t (beside t t))))))
在代碼的第一行使用 #lang
來使用不同的方言. 下面的範例使用 Racket 的一種靜態類型的方言 Typed Racket 計算階層。
#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
(if (zero? n) 1 (* n (fact (- n 1)))))
註釋
- ^ Racket v8.13.
- ^ Typed Racket. [2014-03-05]. (原始內容存檔於2020-11-11).
- ^ Lazy Racket. [2014-03-05]. (原始內容存檔於2021-04-19).
- ^ Scribble. [2014-03-05]. (原始內容存檔於2022-12-11).
- ^ FrTime. [2014-03-05]. (原始內容存檔於2023-01-16).
- ^ Strickland, T.S.; Fellesisen, Matthias. DLS 2010: Contracts for First-Class Classes (PDF). 2010 [2014-03-05]. (原始內容 (PDF)存檔於2013-05-23).
- ^ Bonnaire-Sergeant, Ambrose. A Practical Optional Type System for Clojure (學位論文). The University of Western Australia. 2012.
- ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. Revised6 Report on the Algorithmic Language Scheme (R6RS). Scheme Steering Committee. August 2007 [2011-09-13]. (原始內容存檔於2013-06-25).
- ^ Racket v8.15. 2024年11月5日 [2024年11月7日].
- ^ PLT Scheme. [2014-03-05]. (原始內容存檔於2014-03-05).
- ^ What does "PLT" stand for?. [2014-03-05]. (原始內容存檔於2014-08-21).
- ^ DrRacket. [2014-03-05]. (原始內容存檔於2014-03-05).
- ^ Matthias Felleisen; et al. The Racket Manifesto. [March 25, 2015]. (原始內容存檔於2015年4月2日).
- ^ 存档副本 (PDF). [2014-03-12]. (原始內容存檔 (PDF)於2013-04-30).
- ^ From PLT Scheme to Racket. Racket-lang.org. [2011-08-17]. (原始內容存檔於2013-05-30).