Racket(原名 PLT Scheme[5][6])是個通用、多範型,屬於Lisp家族的函數式程序设计語言,它的設計目之一是為了提供一種用於創造設計與實作其它編程語言的平台,Racket被用於腳本程式設計、通用程式設計、電腦科學教育和學術研究等不同領域。

Racket
Racket-logo.svg
Drracket.png
运行于Ubuntu的DrRacket
编程范型多范式: 函数式, 过程式, 模块化, 面向对象, 逻辑, 反射, 元编程
實作者PLT Inc.
发行时间1995年,​26年前​(1995
穩定版本
8.0[1]在维基数据编辑
( 2021年2月4日,2個月前 )
型態系統动态类型, 强类型, 静态类型
系统平台x86, PowerPC, SPARC, MIPS, ARM
作業系統跨平台
許可證LGPL
文件扩展名.rkt, .rktl, .rktd, .scrbl, .plt, .ss, .scm
網站racket-lang.org
衍生副語言
Typed Racket, Lazy Racket, Scribble, FrTime, more
啟發語言
Scheme, Eiffel[2]
影響語言
Clojure[3]RustScheme[4]

Racket有一個實作平台,包含了執行環境、函数庫、即時編譯器(JIT compiler)等等,還有提供一個以Racket本身寫成的開發環境 DrRacket[7] (原名 DrScheme)。

Racket平台的發行版本是免費且開放原始碼的,以GNU宽通用公共许可证授權發行,所有由社群所編寫的擴充功能和套件都會被上傳到 PLaneT(一個網頁套件發佈系統)。

基於 Racket 實現的 Scribble 可以用來構建HTMLPDF(依賴 LaTeX),Racket 官方文檔就是基於這個語言來編寫的。

开发原则编辑

Racket的开发基于以下原则:[8]

  • 程式语言的目的是表述和解决问题,这一过程通常在特定的情境中发生,该情境有一定的描述语言,因此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 加入了教學用語言,例如 代數步進器[9]讀取-求值-輸出循環、constructor-based printer 和其他許多發明,推出了一套有應用價值的程式教學環境。

2001年,核心團隊(Felleisen, Findler, Flatt, Krishnamurthi)也編纂和發行了他們的第一本教科書《How to Design Programs 1ed》,融入了許多他們的教學理念。

代碼範例编辑

杨辉三角形(代碼來自: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 官網):

 
The result of this program, as shown in DrRacket
#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)))))

註釋编辑

  1. ^ Release 8.0. 2021年2月4日 [2021年2月14日]. 
  2. ^ Strickland, T.S.; Fellesisen, Matthias. DLS 2010: Contracts for First-Class Classes (PDF). 2010 [2014-03-05]. (原始内容 (PDF)存档于2013-05-23). 
  3. ^ Bonnaire-Sergeant, Ambrose. A Practical Optional Type System for Clojure (Thesis). The University of Western Australia. 2012. 
  4. ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; 等. Revised6 Report on the Algorithmic Language Scheme (R6RS). Scheme Steering Committee. August 2007 [2011-09-13]. (原始内容存档于2013-06-25). 
  5. ^ PLT Scheme. [2014-03-05]. (原始内容存档于2014-03-05). 
  6. ^ What does "PLT" stand for?. [2014-03-05]. (原始内容存档于2014-08-21). 
  7. ^ DrRacket. [2014-03-05]. (原始内容存档于2014-03-05). 
  8. ^ Matthias Felleisen; 等. The Racket Manifesto. [March 25, 2015]. (原始内容存档于2015年4月2日). 
  9. ^ 存档副本 (PDF). [2014-03-12]. (原始内容存档 (PDF)于2013-04-30). 

外部連結编辑