Groovy Builders与Lisp/Scheme代码作为数据

Groovy Builders与Lisp/Scheme代码作为数据,groovy,scheme,racket,builder-pattern,Groovy,Scheme,Racket,Builder Pattern,这是一个由两部分组成的问题,与“代码即数据”有关 我一直在学习Groovy的各种构建器(JSON、XML、CLI),并发现它们的声明性语法令人耳目一新。Groovy的构建器是“代码就是数据”的一个例子吗 我以前做过一些Racket编程,我想知道Groovy的builder模式是否可以轻松移植。我知道quote和unquote功能,但使用这些功能将意味着引用的代码更像是一个“模板”,与程序中的其他代码不在同一级别(有术语吗?)。这就是宏发挥作用的地方吗 在scheme中,代码就是数据,因为它的数据

这是一个由两部分组成的问题,与“代码即数据”有关

我一直在学习Groovy的各种构建器(JSON、XML、CLI),并发现它们的声明性语法令人耳目一新。Groovy的构建器是“代码就是数据”的一个例子吗


我以前做过一些Racket编程,我想知道Groovy的builder模式是否可以轻松移植。我知道
quote
unquote
功能,但使用这些功能将意味着引用的代码更像是一个“模板”,与程序中的其他代码不在同一级别(有术语吗?)。这就是宏发挥作用的地方吗

在scheme中,代码就是数据,因为它的数据语法和代码语法没有太大区别。Scheme的语法非常简单,我们几乎可以说在Scheme中编写代码就像直接在抽象语法树中编写代码一样。有趣的是,您可以使用代码作为程序的输入,该程序将代码作为数据进行操作,以输出方案代码。宏就是正在发生的事情,它使用代码作为数据并输出将被求值或编译的方案代码。简单地说,方案代码可以操作本机方案代码来输出方案代码。您可以将代码转换为数据并作为代码执行。这允许schemer在scheme本身中扩展语言。与其他许多被迫扩展编译器/解释器以理解新语法的语言不同。@LoïcFaure Lacroix,谢谢你的回复。在Groovy的构建器中,它们实际上并没有操作任何语法,所以在本例中,代码作为数据可能不是正确的术语。我觉得有趣的是,给定一个表达语法,就不需要使用宏了。在scheme中,代码就是数据,因为它的数据语法和代码语法没有太大区别。Scheme的语法非常简单,我们几乎可以说在Scheme中编写代码就像直接在抽象语法树中编写代码一样。有趣的是,您可以使用代码作为程序的输入,该程序将代码作为数据进行操作,以输出方案代码。宏就是正在发生的事情,它使用代码作为数据并输出将被求值或编译的方案代码。简单地说,方案代码可以操作本机方案代码来输出方案代码。您可以将代码转换为数据并作为代码执行。这允许schemer在scheme本身中扩展语言。与其他许多被迫扩展编译器/解释器以理解新语法的语言不同。@LoïcFaure Lacroix,谢谢你的回复。在Groovy的构建器中,它们实际上并没有操作任何语法,所以在本例中,代码作为数据可能不是正确的术语。我觉得有趣的是,给定一个表达语法,就不需要使用宏了。