据说方案宏至少是语法大小写变体,它允许对要转换的代码进行任意计算。但是(无论是在一般情况下还是在我目前正在研究的特定情况下),这都需要根据递归函数指定计算。当我尝试各种变体时,例如

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

(如果需要的话,实现方式是球拍。)

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

我想我可以求助于Y组合器,但是我认为值得首先询问是否有更好的方法?

最佳答案

是的,您正在使用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"))

关于macros - Scheme宏中的任意计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4123063/

10-10 02:55