Macros 球拍vs方案宏

Macros 球拍vs方案宏,macros,scheme,racket,Macros,Scheme,Racket,racket宏是否比Scheme或Common Lisp中的宏具有更高级的功能?我怀疑是这样的,特别是关于模块、名称空间和作用域等,但我希望能简单介绍一下Racket宏可以做什么,如果有的话,其他lisp做不到的话 此外,Scheme/CL还向开发人员公开了reader层,使用它,在那些Lisp中不可能创建全新的语言(不仅仅是s-expr宏),比如Scribble,就像在Racket中一样吗 换句话说,Racket仅仅是围绕“面向语言编程”的一种哲学/惯例,并为此目的提供了方便的语法包装,还是它

racket宏是否比Scheme或Common Lisp中的宏具有更高级的功能?我怀疑是这样的,特别是关于模块、名称空间和作用域等,但我希望能简单介绍一下Racket宏可以做什么,如果有的话,其他lisp做不到的话

此外,Scheme/CL还向开发人员公开了reader层,使用它,在那些Lisp中不可能创建全新的语言(不仅仅是s-expr宏),比如Scribble,就像在Racket中一样吗

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


非常感谢。

我推荐你阅读马修·弗拉特的论文

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

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

更新


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

  • 模块系统允许指定基础语言
  • 上下文相关宏
第一个项目基本上就是
#lang
所做的。让模块系统负责设置读卡器和给定模块中可用的绑定,可以方便地使用不同的语言。如果没有这一点,使用Scribble或exp的
等语言将更加麻烦

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

这并不是帮助在Racket中构建语言的功能的详尽列表。如果你有兴趣阅读更多关于它的信息,这篇文章值得一读。

在@Scott将其发布到列表上后,同样的问题也请参见@Scott,以及一篇最近的综述文章