球拍宏是否具有比Scheme或Common Lisp中更高级的功能?我怀疑,特别是关于模块,命名空间和范围等等,但我很欣赏一个简单的概述,即Racket宏可以做什么,如果有的话,其他lisps不能 .
另外,Scheme / CL还将读者层暴露给开发人员,使用它,在这些lisps中不可能创建全新的语言(不仅仅是s-expr宏),比如Scribble,你可以在Racket中使用它吗?
换句话说,Racket只是一个围绕“语言导向编程”的哲学/惯例,为此目的使用方便的语法包装器,还是从根本上扩展Scheme以在该语言中做技术上不可能的事情?
非常感谢 .
3 回答
使“语言导向编程”在Racket中起作用的两个关键特性是:
模块系统允许指定基本语言
上下文相关的宏
第一个子弹基本上是
#lang
的作用 . 让模块系统负责设置阅读器和给定模块中可用的绑定允许容易地使用不同的语言 . 如果没有这个,使用像Scribble或at-exp
这样的语言会更麻烦 .第二个是Racket提供可覆盖的上下文相关宏,例如
#%app
,_ _1178692_等,允许自定义模块或整个模块中的每个函数应用程序 . 这允许在整个模块上添加例如类型检查传递 .对于阅读更多有关它的问题,这并不值得一读 . 值得一读的是.1748694_论文值得一读 .
我建议阅读Matthew Flatt的论文"Composable and Compilable Macros - You Want it When?" .
它解释了如何在Racket中协同工作的宏和模块 .
然后在Racket中实现一种小语言 - 比如说TinyBasic . 然后与其他语言进行比较 .
UPDATE
http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf
在@Scott将其发布到列表中后,请参阅Matthew's reply以获取相同的问题,并附上更新的概述文件 .