Scheme宏中的任意计算

rwa*_*ace 2 macros scheme racket

方案宏,至少语法 - 案例变量,据说允许对要转换的代码进行任意计算.但是(在一般情况下和我目前正在查看的特定情况下)这要求根据递归函数指定计算.当我尝试各种变体时,我会得到例如

main.scm:32:71:编译:模块中的未绑定标识符(在转换器环境中,不包括运行时定义):expand-vars

(实施是Racket,如果重要的话.)

结果似乎是在宏处理之后才能定义命名函数.

我想我可以使用Y组合器,但我认为首先要问是否有更好的方法?

Eli*_*lay 7

是的,你使用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")).