Macros 为什么可以';自定义struct id构造函数的应用程序吗?

Macros 为什么可以';自定义struct id构造函数的应用程序吗?,macros,racket,expansion,Macros,Racket,Expansion,我想在Racket中构建一种自定义语言,它需要重新定义隐式形式#%app。但是,使用宏步进器时,我注意到与常规的“proc id”函数应用程序不同,struct id应用程序不会被自定义的#%app表单替换。为什么会这样 我的猜测是,您在宏步进器中看到的结果是(除非您使用关键字选项另外指定)struct将结构名称绑定到宏,以传递有关结构类型的静态信息,该结构类型由match、shared、struct out使用,和其他宏。当用作表达式时,此宏将扩展为构造函数,该构造函数绑定到其他不可访问的名称

我想在Racket中构建一种自定义语言,它需要重新定义隐式形式
#%app
。但是,使用宏步进器时,我注意到与常规的“
proc id
”函数应用程序不同,struct id应用程序不会被自定义的
#%app
表单替换。为什么会这样

我的猜测是,您在宏步进器中看到的结果是(除非您使用关键字选项另外指定)
struct
将结构名称绑定到宏,以传递有关结构类型的静态信息,该结构类型由
match
shared
struct out
使用,和其他宏。当用作表达式时,此宏将扩展为构造函数,该构造函数绑定到其他不可访问的名称。如果这似乎不能解释您所看到的,那么您可以给出一个代码示例

在任何情况下,如果禁用宏隐藏,您将看到构造函数的直接应用程序确实使用了正确的
#%app
表单。例如,此程序:

#朗球拍
(模块语言)
(提供(重命名[我的应用程序#%app])
(外拍除外(全部外拍)
#%(应用程序))
(定义语法规则(我的应用程序…)
(让()
(打印应用程序表单(rand…)
(兰特…)
(定义(引用打印应用程序表单)
(printf“~a\n”引用)))
(主模块(子模块“.”语言)
(结构包(内容)
#:透明)
(定义食品杂货)
(橙子牛奶沙司)
(袋装食品)
打印以下输出,其中
bag1
#%app
bag
宏后展开的工件:

; (bag1 groceries)
(bag '(oranges milk salsa))

这真的不清楚。你能澄清你的问题吗?给我们一些代码示例,至少可以说明这个问题。