方案宏,至少语法 - 案例类型,据说允许对要转换的代码进行任意计算。但是(在一般情况下和我目前正在查看的特定情况下)这要求根据递归函数指定计算。当我尝试各种变体时,我会得到例如。
main.scm:32:71:编译:模块中的未绑定标识符(在转换器环境中,不包括运行时定义):expand-vars
(实施是Racket,如果重要的话。)
结果似乎是在宏处理之前你无法定义命名函数。
我想我可以使用Y组合器,但我认为首先要问一下是否有更好的方法?
答案 0 :(得分:7)
是的,你使用Racket的事实很重要 - 在Racket中,有一种叫做“相分离”的东西,这意味着语法级别不能使用运行时功能。例如,这个:
#lang racket
(define (bleh) #'123)
(define-syntax (foo stx)
(bleh))
(foo)
由于bleh
绑定在运行时,不起作用,因为语法不可用。相反,它应该是
(define-for-syntax (bleh) #'123)
或
(begin-for-syntax (define (bleh) #'123))
或作为内部定义移动到宏体,或移动到自己的模块并使用(require (for-syntax "bleh.rkt"))
进行操作。