Racket
(原名 [9][10])是個通用、多範型,屬於Lisp家族的函數式程序设计語言,它的設計目之一是為了提供一種用於創造設計與實作其它編程語言的平台,Racket被用於腳本程式設計、通用程式設計、電腦科學教育和學術研究等不同領域。
运行于Ubuntu的DrRacket | |
多范型: 函数式, 反射式, 元编程, 面向语言, 面向对象, 过程式, 模块化, 逻辑式 | |
语言家族 | 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有一個實作平台,包含了執行環境、函数庫、即時編譯器()等等,還有提供一個以Racket本身寫成的開發環境 DrRacket[11] (原名 )。
Racket平台的發行版本是免費且開放原始碼的,以GNU宽通用公共许可证授權發行,所有由社群所編寫的擴充功能和套件都會被上傳到 PLaneT(一個網頁套件發佈系統)。
基於 Racket 實現的 Scribble 可以用來構建HTML或PDF(依賴 LaTeX),Racket 官方文檔就是基於這個語言來編寫的。
开发原则
Racket的开发基于以下原则:[12]
- 程式语言的目的是表述和解决问题,这一过程通常在特定的情境中发生,该情境有一定的描述语言,因此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 加入了教學用語言,例如 代數步進器[13]、讀取-求值-輸出循環、constructor-based printer 和其他許多發明,推出了一套有應用價值的程式教學環境。
2001年,核心團隊(Felleisen, Findler, Flatt, Krishnamurthi)也編纂和發行了他們的第一本教科書《程序设计方法》,融入了許多他們的教學理念。
在2010年6月7日, PLT Scheme被重命名为Racket[14]。
代碼範例
杨辉三角形(代碼來自: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)))))
註釋
- .
- . [2014-03-05]. (原始内容存档于2020-11-11).
- . [2014-03-05]. (原始内容存档于2021-04-19).
- . [2014-03-05]. (原始内容存档于2022-12-11).
- . [2014-03-05]. (原始内容存档于2023-01-16).
- Strickland, T.S.; Fellesisen, Matthias. (PDF). 2010 [2014-03-05]. (原始内容 (PDF)存档于2013-05-23).
- Bonnaire-Sergeant, Ambrose. (学位论文). The University of Western Australia. 2012.
- Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. . Scheme Steering Committee. August 2007 [2011-09-13]. (原始内容存档于2013-06-25).
- . [2014-03-05]. (原始内容存档于2014-03-05).
- . [2014-03-05]. (原始内容存档于2014-08-21).
- . [2014-03-05]. (原始内容存档于2014-03-05).
- Matthias Felleisen; et al. . [March 25, 2015]. (原始内容存档于2015年4月2日).
- (PDF). [2014-03-12]. (原始内容存档 (PDF)于2013-04-30).
- . Racket-lang.org. [2011-08-17]. (原始内容存档于2013-05-30).