Racket

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

Racket
Racket-logo.svg
Drracket.png
运行于Ubuntu的DrRacket
编程范型多范型: 函数式, 反射式, 元编程, 面向语言, 面向对象, 过程式, 模块化, 逻辑式
语言家族Lisp/Scheme
实现者PLT Inc.
发行时间1995年,​28年前​(1995
类型系统动态类型, 强类型, 静态类型
系统平台x86, PowerPC, SPARC, MIPS, ARM
操作系统跨平台
许可证LGPL
文件扩展名.rkt, .rktl, .rktd, .scrbl, .plt, .ss, .scm
网站racket-lang.org
派生副语言
Typed Racket[1], Lazy Racket[2], Scribble[3], FrTime[4]
启发语言
Scheme, Eiffel[5]
影响语言
Clojure[6]RustScheme[7]

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

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

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

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

外部链接