Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Scheme宏的替换和扩展模型是否可以改进?_Macros_Scheme_Racket - Fatal编程技术网

Macros Scheme宏的替换和扩展模型是否可以改进?

Macros Scheme宏的替换和扩展模型是否可以改进?,macros,scheme,racket,Macros,Scheme,Racket,据我所知,基于模式和模板的Scheme宏系统首先通过模式匹配宏调用,在成功的情况下获得替换,将生成的替换应用于相应的模板以构建(可能)部分扩展的表达式,然后继续扩展生成的表达式。如果我所描述的是真的(请纠正我,否则),那么在我看来,这种构建和再次扩展模型是没有效率的。为什么扩展需要这样做?是否可以通过一次彻底地运行模板来完成扩展?宏系统的语义是按照您描述的方式指定的。然而,实现可以自由地以任何方式实现该规范;特别是,它们可以提前“内联”宏扩展,以加快宏扩展过程 我不知道有任何Scheme实现可以

据我所知,基于模式和模板的Scheme宏系统首先通过模式匹配宏调用,在成功的情况下获得替换,将生成的替换应用于相应的模板以构建(可能)部分扩展的表达式,然后继续扩展生成的表达式。如果我所描述的是真的(请纠正我,否则),那么在我看来,这种构建和再次扩展模型是没有效率的。为什么扩展需要这样做?是否可以通过一次彻底地运行模板来完成扩展?

宏系统的语义是按照您描述的方式指定的。然而,实现可以自由地以任何方式实现该规范;特别是,它们可以提前“内联”宏扩展,以加快宏扩展过程


我不知道有任何Scheme实现可以实现您所描述的功能,我猜这是因为宏扩展通常不是编译中的一个大瓶颈。

请记住,可以处理宏定义过程时间和整个程序的编译时间

此外,宏扩展可能会变成另一个(或类似)需要扩展的宏形式。例如,您可以创建一个宏,最终作为
cond
表达式,这当然是大多数方案中嵌套的
if
表达式的宏


你看到了吗?它计算一个程序(在一个表达式中)并返回一个没有宏的相等程序。

我见过两个
语法case
的实现,一个是R.Kent Dybvig(在两篇论文中有记录)的,另一个是Andrévan Tonder(参见)的,按我所描述的做。@plmday我不认为StackOverflow是用于反问的。如果你已经知道答案(“是的,可以改进”),那么你应该发布答案——并将你自己的答案标记为已接受。@GregHendershott:我意识到我误解了约翰。通过“你所描述的”,他指的是我质疑的方式:一次运行模式。而当我说“我所描述的”时,我指的是我所描述的方式,即构建然后扩展模型。所以,不,这不是一个修辞问题。在我看来,你把语义和实现混淆了。如果这对你来说没有意义,请告诉我。什么是定义时间?另外,我不确定我是否理解你第二段中的理由。你能描述一下在这种情况下我建议的方法(一次运行)无法处理的原因吗?很好地想象
(mymacro xxx yyy)
(cond((eq?xxx 0)expr)((eq?xxx 1)expr2)(else expr3))替换为
,因为
cond
是一个宏。。最终结果可能是
(if(eq?xxx 0)(begin expr1)(if(eq?xxx 1)(begin expr2)(begin expr3))
但它也可以是底层原语实现的宏。
begin
在结果中,它是一个需要扩展的宏…等等。Define time==我正在对过程进行计算。通常在过程调用之前和编译代码编译时进行。我不明白的是为什么我不能立即当我看到它时,不断扩展
cond
,而不是建立表达式然后扩展它。这种宏扩展模型类似于$\lambda$-演算的基于低效替换的模型。完成了一次替换,建立了一个新的表达式,并在此表达式上继续缩减。但是延迟替换可以通过一个环境来实现。所以我想问的是,是否可以对宏扩展使用类似的技巧?构建表达式是什么意思?在检查结果表单本身是否为宏之前,您肯定需要一个完整的结果表单,如果不是,则检查结果表单的任何部分是否为宏?您不需要他需要检查模式是否也匹配(可能不匹配)。在编译语法之前(比如
mymacro
直接转换到
if
),您甚至可以扩展这些模式,但这只适用于词法变量。模式符号类似于也可以是语法的变量。