Macros 在Racket中,我可以重新定义形式'if',并让其他派生形式自动遵循它的新语义吗?

Macros 在Racket中,我可以重新定义形式'if',并让其他派生形式自动遵循它的新语义吗?,macros,racket,Macros,Racket,在定制的Racket语言中,我想更改核心表单if以及扩展到它的其他表单(例如和和cond)的行为 当然,我可以重新定义每一种形式,但这似乎是多余的。例如,这里有一个例子,修改后的if希望它的每个参数都包装在一个列表中。宏和在此被明确重新定义 ;;my-lang.rkt #球拍/球座 (需要(用于语法球拍/底座)) (提供#%模块开始#%数据#%应用程序) 列表 (重命名为[car if][car and])) (定义语法(如果是stx,则为car) (语法大小写stx() [(c t f)#'(

在定制的Racket语言中,我想更改核心表单
if
以及扩展到它的其他表单(例如
cond
)的行为

当然,我可以重新定义每一种形式,但这似乎是多余的。例如,这里有一个例子,修改后的
if
希望它的每个参数都包装在一个列表中。宏
在此被明确重新定义

;;my-lang.rkt
#球拍/球座
(需要(用于语法球拍/底座))
(提供#%模块开始#%数据#%应用程序)
列表
(重命名为[car if][car and]))
(定义语法(如果是stx,则为car)
(语法大小写stx()
[(c t f)#'(如果(汽车c)t f)])
(定义语法(car和stx);这似乎是多余的
(语法大小写stx()
[(#)t]
[(x)#'x]
[(xxs…)#'(汽车如果x(汽车和xs…)x)])
#lang s-exp“my-lang.rkt”
(如果(列表f)(列表2)(列表3));=>(3)
(和(列表f)(列表2));=>(#f)
通过将我对
if
的新定义注入
racket/base
提供的现有定义中,是否有更简单的方法来重新定义这些表单?

答案是否定的

让我们考虑格式<代码>和<代码>。它被定义为一个宏(某个地方)。 它看起来像:

#lang mumble
(define-syntax (and stx)
   (syntax-case stx ()
     [(_and)             #'#t]
     [(_and e)           #'e]
     [(_and e1 e2)       #'(let ([t e1]) (if t e2 #f))]
     [(_and e1 e2 e ...) #'(let ([t e1]) (if t (and e2 e ...)))]
     [_ (raise-syntax-error 'and "bad syntax" stx)]))
由于球拍宏系统是“参考透明”的,
标识符使用标准词汇范围规则进行绑定。就是 扩展中的
if
绑定到模块中的
if
,其中 宏已定义。关键是宏编写器没有 需要担心任何用户重新定义扩展中使用的任何标识符

更改上述
宏行为的唯一方法是
如果使用了
,请更改
。因此,只有当您能够访问该定义时
对于“mumble”,如果使用了
,则可以更改
。就标准而言
球拍
任何用户都不能更改定义

简言之,由于宏观系统的设计,答案是“否”