利用宏进行代码转换
宏的工作机制
• Macro Expansion: 宏在代码评估之前对代码进行转换。在这个例子中,宏将接收到的表达式包裹在一个begin表达式中,确保expr被顺序执行两次。
• Code Transformation: 由于宏作用于源代码层面,所以它可以引入在普通函数中无法实现的转换。在这个例子中,twice宏实际上生成了一个begin块,里面包含了两次expr表达式。
1. (list 'if expr ''passed ...):
• 这部分生成一个if表达式。如果expr为真,则结果为'passed。
• 注意这里使用了两个撇号''来避免'passed被求值。在Scheme中,''something等同于(quote something),它确保了passed作为字面量输出而不是被当作变量求值。
2. (list 'quote (list 'failed: expr)):
• 这是if表达式的否定分支,用于生成失败的消息。
• 外层的list 'quote ...确保内部列表不会被求值,而是作为一个字面量列表返回。
• 内层的(list 'failed: expr)创建一个列表,其中包含一个标记failed:和表达式expr的当前值。
For Macros
Scheme 中没有内置的 for 功能,通过 define 定义在使用时有些麻烦,这里使用宏进行一个定义

这里基本就是把调用 define map 这个函数的过程,通过 define-macro 进行构建和输出,以达到简化的目的
Trace
这里用 Scheme 实现了一个 python 中的装饰器功能,用于记录函数调用的情况


以上是宏定义的版本