23

球拍宏是否具有比 Scheme 或 Common Lisp 中的功能更高级的功能?我怀疑是这样,特别是关于模块、名称空间和范围等,但我很感激 Racket 宏可以做什么的简单概述,如果有的话,其他 lisps 不能。

此外,Scheme/CL 还向开发人员公开了阅读器层,使用它,在那些 lisps 中是否不可能像在 Racket 中那样创建全新的语言(不仅仅是 s-expr 宏),例如 Scribble?

换句话说,Racket 仅仅是一种围绕“面向语言的编程”的哲学/约定,并为此提供了方便的句法包装器,还是从根本上扩展了 Scheme 以完成该语言在技术上不可能完成的事情?

非常感谢。

4

3 回答 3

17

使“面向语言的编程”在 Racket 中工作的两个关键特性是:

  • 模块系统允许指定基础语言
  • 上下文相关的宏

第一个子弹基本上是做什么#lang的。让模块系统负责设置阅读器,并且给定模块中可用的绑定允许轻松使用不同的语言。如果没有这个,使用像 Scribble 或at-exp.

第二个是 Racket 提供了可覆盖的上下文相关宏,例如#%app#%module-begin等,允许自定义模块内的每个功能应用程序或整个模块。例如,这允许在整个模块上添加类型检查通道。

这不是帮助在 Racket 中构建语言的功能的详尽列表。如果您有兴趣阅读有关它的更多信息,“Languages as Libraries”论文值得一读。

于 2012-11-05T14:33:20.353 回答
14

我建议阅读论文“可组合和可编译的宏 - 你什么时候想要它?” 马修·弗拉特。

它解释了宏和模块如何在 Racket 中协同工作。

然后在 Racket 中实现一种小语言——比如 TinyBasic。然后与其他语言进行比较。

更新

http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf

于 2012-11-05T10:48:49.660 回答
6

在@Scott 将其发布到列表后,另请参阅Matthew 对同一问题的回复,以及更新的概述论文。

于 2012-11-11T19:27:48.663 回答