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