23 Racket和Scheme的方言
我们使用“Racket”来指Lisp语言的一种特定方言,它基于Lisp家族的Scheme分支。尽管Racket与Scheme相似,但模块上的#lang前缀是Racket的一个特殊特性,以#lang开始的程序不太可能在Scheme的其它实现中运行。同时,不以#lang开始的程序不能在大多数Racket工具的默认模式下工作。
然而,“Racket”并不是Racket工具支持的唯一Lisp方言。相反,Racket工具旨在支持Lisp的多种方言,甚至是多种语言,这使得Racket工具包可以服务于多个社区。Racket还为程序员和研究人员提供了探索和创建新语言所需的工具。
“Racket”更多的是关于编程语言的概念,而不是通常意义上的语言。宏可以扩展基本语言(如宏中所述),替代解析器可以从头构建一种全新的语言(如《创造语言》中所述)。
启动Racket模块的#lang行声明了模块的基本语言。所谓“Racket”,我们通常指的是#lang,后面是基础语言racket或racket/base(其中racket是一个扩展)。Racket发行版提供了其它语言,包括:
-
typed/racket——像racket一样,但是静态类型的;参见《(part ("(lib typed-racket/scribblings/ts-guide.scrbl)" "top"))》。
-
lazy——像racket/base一样,但避免在需要表达式值之前对其求值;参见惰性(Lazy)Racket文档。
-
scribble/base——一种看起来更像Latex而不是Racket的语言,用于编写文档;参见《(part ("(lib scribblings/scribble/scribble.scrbl)" "top"))》。
这些语言中的每一种都是通过在#lang之后使用语言名称启动模块来使用的。例如,本文档的源码即以#lang scribble/base开头。
此外,Racket用户可以定义自己的语言,如创造语言中所述。通常,一个语言名通过添加/lang/reader通过模块路径映射到它的实现;例如,语言名scribble/base扩展为scribble/base/lang/reader,这是实现表面语法分析器的模块。一些语言名称充当语言加载程序;例如,#lang planet planet-path通过PLaneT下载、安装和使用一个语言。
Scheme的标准方言包括由r5rs和r6rs定义的方言。
“R5RS”代表The Revised5 Report on the Algorithmic Language Scheme,它是目前实施最广泛的Scheme标准。
Racket工具在其默认模式下不符合R5RS,这主要是因为Racket通常需要模块,而R5RS没有定义模块系统。典型的单文件R5RS程序可以通过在它们前面加上#lang r5rs来转换为Racket程序,但其它Scheme系统无法识别#lang r5rs。plt-r5rs可执行文件(参见《(part ("(lib r5rs/r5rs.scrbl)" "plt-r5rs"))》)更直接地符合R5RS标准。
除了模块系统之外,R5RS和Racket的句法表和函数也有所不同。只有简单的R5RS在前缀为#lang racket时才成为Racket程序,而当删除#lang行时,相对较少的Racket编程成为R5RS程序。此外,当将”R5RS模块”与Racket模块混合时,请注意R5RS序对对应于Racket可变序对(如用mcons构造的)。
有关使用Racket运行R5RS程序的详细信息,请参见《(part ("(lib r5rs/r5rs.scrbl)" "top"))》。
“R6RS”代表The Revised6 Report on the Algorithmic Language Scheme,该方案使用类似于Racket模块系统的模块系统扩展了R5RS。
当R6RS库或顶级程序前缀为#!时r6rs(有效的R6RS语法),那么它也可以用作Racket程序。这是因为#!在Racket中被视为#lang的缩写,后跟空格,所以#! r6rs选择r6rs模块语言。然而,与R5RS一样,请注意R6RS的语法表和函数与Racket不同,并且R6RS序对是可变序对。
参见(part ("(lib r6rs/scribblings/r6rs.scrbl)" "top"))有关使用Racket运行R6RS程序的详细信息,请参见《(part ("(lib r6rs/scribblings/r6rs.scrbl)" "top"))》。
How to Design Programs教科书依靠Racket的教学变体,为新程序员顺利引入编程概念。请参见the How to Design Programs语言 documentation。
How to Design Programs语言通常不与#lang前缀一起使用,而是通过从Choose Language...对话框中选择语言在DrRacket中使用。