Macros 如何在Racket中使用宏重命名过程?

Macros 如何在Racket中使用宏重命名过程?,macros,scheme,racket,Macros,Scheme,Racket,假设我想在编译时替换所有出现的过程,例如所有出现的cons都用替换。如果手动编写这样的宏,则需要使用make set-变压器 请注意,您需要处理赋值(set!x e)和引用x以及应用程序(x arg0 arg1…)都需要由语法大小写表达式中的子句处理 更新 在Dybvig的书《Scheme编程语言》中,他举了一个宏定义可积的的例子,这听起来正是你所追求的 要做到这一点,最简单(可能也是最好)的方法是使用不同的名称导入标识符: (require)(在racket/base中重命名[cons Wi

假设我想在编译时替换所有出现的过程,例如所有出现的
cons
都用
替换。如果手动编写这样的宏,则需要使用
make set-变压器

请注意,您需要处理赋值
(set!x e)
和引用
x
以及应用程序
(x arg0 arg1…)
都需要由
语法大小写表达式中的子句处理

更新

在Dybvig的书《Scheme编程语言》中,他举了一个宏
定义可积的
的例子,这听起来正是你所追求的

要做到这一点,最简单(可能也是最好)的方法是使用不同的名称导入标识符:


(require)(在racket/base中重命名[cons With
(define new var old var)
您在运行时不引入任何操作。您只是定义相同的值有两个不同的名称,并且您可以同时使用这两个名称而不会导致任何低效(您只是使代码更难阅读)因此,如果
旧var
是一个函数,那么通过调用
(新var参数)
相当于调用
(旧var参数)
,而不需要任何额外的函数调用。“这是运行时一个完整的额外函数调用”。不是真的。两个绑定都指向同一个函数,因此它不像
(define(de a d)(cons a d))