Racket(原名 PLT Scheme[10][11])是个通用、多范型,属于Lisp家族的函数式程序设计语言,它的设计目之一是为了提供一种用于创造设计与实作其它编程语言的平台,Racket被用于脚本程式设计、通用程式设计、电脑科学教育和学术研究等不同领域。

Racket
运行于Ubuntu的DrRacket
编程范型多范型: 函数式, 反射式, 元编程, 面向语言, 面向对象, 过程式, 模块化, 逻辑式
语言家族Lisp/Scheme
实作者PLT Inc.
发行时间1995年,​29年前​(1995
当前版本
  • 8.13(2024年5月16日;稳定版本)[1]
编辑维基数据链接
型态系统动态类型, 强类型, 静态类型
系统平台x86, PowerPC, SPARC, MIPS, ARM
操作系统跨平台
许可证LGPL
文件扩展名.rkt, .rktl, .rktd, .scrbl, .plt, .ss, .scm
网站racket-lang.org
衍生副语言
Typed Racket[2], Lazy Racket[3], Scribble[4], FrTime[5]
启发语言
Scheme, Eiffel[6]
影响语言
Clojure[7]RustScheme[8]

Racket有一个实作平台,包含了执行环境、函数库、即时编译器(JIT compiler)等等,还有提供一个以Racket本身写成的开发环境 DrRacket[12] (原名 DrScheme)。

Racket平台的发行版本是免费且开放原始码的,以GNU宽通用公共许可证授权发行,所有由社群所编写的扩充功能和套件都会被上传到 PLaneT(一个网页套件发布系统)。

基于 Racket 实现的 Scribble 可以用来构建HTMLPDF(依赖 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 官网):

 
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. ^ Racket v8.13. 
  2. ^ Typed Racket. [2014-03-05]. (原始内容存档于2020-11-11). 
  3. ^ Lazy Racket. [2014-03-05]. (原始内容存档于2021-04-19). 
  4. ^ Scribble. [2014-03-05]. (原始内容存档于2022-12-11). 
  5. ^ FrTime. [2014-03-05]. (原始内容存档于2023-01-16). 
  6. ^ Strickland, T.S.; Fellesisen, Matthias. DLS 2010: Contracts for First-Class Classes (PDF). 2010 [2014-03-05]. (原始内容 (PDF)存档于2013-05-23). 
  7. ^ Bonnaire-Sergeant, Ambrose. A Practical Optional Type System for Clojure (学位论文). The University of Western Australia. 2012. 
  8. ^ 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). 
  9. ^ Racket v8.15. 2024年11月5日 [2024年11月7日]. 
  10. ^ PLT Scheme. [2014-03-05]. (原始内容存档于2014-03-05). 
  11. ^ What does "PLT" stand for?. [2014-03-05]. (原始内容存档于2014-08-21). 
  12. ^ DrRacket. [2014-03-05]. (原始内容存档于2014-03-05). 
  13. ^ Matthias Felleisen; et al. The Racket Manifesto. [March 25, 2015]. (原始内容存档于2015年4月2日). 
  14. ^ 存档副本 (PDF). [2014-03-12]. (原始内容存档 (PDF)于2013-04-30). 
  15. ^ From PLT Scheme to Racket. Racket-lang.org. [2011-08-17]. (原始内容存档于2013-05-30). 

外部链接