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