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 定义是啥? [复制]
为啥 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?