Macros Scheme宏中的任意计算

Macros Scheme宏中的任意计算,macros,scheme,racket,Macros,Scheme,Racket,Scheme宏(至少是语法大小写)据说允许对要转换的代码进行任意计算。然而(无论是在一般情况下,还是在我目前正在研究的特定情况下),这都需要使用递归函数来指定计算。当我尝试各种不同的版本时,我得到例如 main.scm:32:71:compile:expand vars中模块(在transformer环境中,不包括运行时定义)中的未绑定标识符 (如果有必要的话,实施过程很麻烦。) 结果似乎是在宏处理之后才能定义命名函数 我想我可以求助于Y combinator,但我认为值得先问一下是否有更好的方

Scheme宏(至少是语法大小写)据说允许对要转换的代码进行任意计算。然而(无论是在一般情况下,还是在我目前正在研究的特定情况下),这都需要使用递归函数来指定计算。当我尝试各种不同的版本时,我得到例如

main.scm:32:71:compile:expand vars中模块(在transformer环境中,不包括运行时定义)中的未绑定标识符

(如果有必要的话,实施过程很麻烦。)

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


我想我可以求助于Y combinator,但我认为值得先问一下是否有更好的方法?

是的,使用Racket很重要——在Racket中,有一种称为“阶段分离”的方法,这意味着语法级别不能使用运行时函数。例如,这:

#lang racket
(define (bleh) #'123)
(define-syntax (foo stx)
  (bleh))
(foo)
将不起作用,因为
bleh
是在运行时绑定的,不适用于语法。相反,它应该是

(define-for-syntax (bleh) #'123)

或作为内部定义移动到宏体,或移动到其自己的模块并使用
(require(对于语法“bleh.rkt”))

(begin-for-syntax (define (bleh) #'123))