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