Racket编程指南——23 Racket和Scheme的方言

23 Racket和Scheme的方言

我们使用“Racket”来指Lisp语言的一种特定方言,它基于Lisp家族的Scheme分支。尽管Racket与Scheme相似,但模块上的#lang前缀是Racket的一个特殊特性,以#lang开始的程序不太可能在Scheme的其它实现中运行。同时,不以#lang开始的程序不能在大多数Racket工具的默认模式下工作。

然而,“Racket”并不是Racket工具支持的唯一Lisp方言。相反,Racket工具旨在支持Lisp的多种方言,甚至是多种语言,这使得Racket工具包可以服务于多个社区。Racket还为程序员和研究人员提供了探索和创建新语言所需的工具。

    23.1 更多的Racket

    23.2 标准

      23.2.1 R5RS

      23.2.2 R6RS

    23.3 教学

 

23.1 更多的Racket

“Racket”更多的是关于编程语言的概念,而不是通常意义上的语言。宏可以扩展基本语言(如中所述),替代解析器可以从头构建一种全新的语言(如《创造语言》中所述)。

启动Racket模块的#lang行声明了模块的基本语言。所谓“Racket”,我们通常指的是#lang,后面是基础语言racketracket/base(其中racket是一个扩展)。Racket发行版提供了其它语言,包括:

  • typed/racket——像racket一样,但是静态类型的;参见《(part ("(lib typed-racket/scribblings/ts-guide.scrbl)" "top"))》。

  • lazy——像racket/base一样,但避免在需要表达式值之前对其求值;参见惰性(Lazy)Racket文档

  • frtime——以更激进的方式改变求值,以支持反应式编程;参见FrTime文档

  • 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下载、安装和使用一个语言。

 

23.2 标准

Scheme的标准方言包括由r5rs和r6rs定义的方言。

23.2.1 R5RS

“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"))》。

23.2.2 R6RS

“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"))》。

 

23.3 教学

How to Design Programs教科书依靠Racket的教学变体,为新程序员顺利引入编程概念。请参见the How to Design Programs语言 documentation

How to Design Programs语言通常不与#lang前缀一起使用,而是通过从Choose Language...对话框中选择语言在DrRacket中使用。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值