Racket 与 Scheme 宏

Posted

技术标签:

【中文标题】Racket 与 Scheme 宏【英文标题】:Racket vs Scheme macros 【发布时间】:2012-10-24 22:21:44 【问题描述】:

球拍宏是否具有比 Scheme 或 Common Lisp 中的功能更高级的功能?我怀疑是这样,尤其是在模块、命名空间和范围等方面,但我希望能简单介绍一下 Racket 宏可以做什么,如果有的话,其他 lisps 不能。

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

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

非常感谢。

【问题讨论】:

【参考方案1】:

我会推荐阅读 Matthew Flatt 的论文 "Composable and Compilable Macros - You Want it When?"。

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

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

更新

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

【讨论】:

【参考方案2】:

在@Scott 将同一问题发布到列表后,另请参阅Matthew's reply,并附有更新的概述论文。

【讨论】:

【参考方案3】:

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

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

第一个项目符号基本上就是#lang 所做的。让模块系统负责设置阅读器,并且给定模块中可用的绑定允许轻松使用不同的语言。没有这个,使用像 Scribble 或 at-exp 这样的语言会更加麻烦。

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

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

【讨论】:

以上是关于Racket 与 Scheme 宏的主要内容,如果未能解决你的问题,请参考以下文章

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

Scheme中的邮政编码验证(Dr. Racket)

为啥 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?

Scheme可以在没有Racket的情况下做GUI吗?还是必须使用 Common Lisp?

Scheme / Racket中的静态变量?

宏定义中的升序数字