2010-11-08 74 views
2

方案宏至少是语法种类,据说可以对要转换的代码进行任意计算。然而(无论是在一般情况下,还是在目前我正在研究的情况下),这都要求按照递归函数来指定计算。当我尝试各种变体时,我会得到方案宏中的任意计算

main.scm:32:71:编译:在模块未结合的识别符(在变压器的环境,这不包括运行时定义):展开 - 瓦尔

(实施是球拍,如果它很重要。)

结果似乎是,直到宏处理后才能定义命名函数。

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

回答

5

是的,你使用Racket的事实很重要 - 在Racket中,有一种叫做“相位分离”的东西,这意味着语法级别不能使用运行时功能。例如,这样的:因为bleh是在运行时绑定,不可用于语法

#lang racket 
(define (bleh) #'123) 
(define-syntax (foo stx) 
    (bleh)) 
(foo) 

将无法​​正常工作。取而代之的是,它应该是

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

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

或移动作为内部定义的宏体,或移动到其自身的模块,并使用(require (for-syntax "bleh.rkt"))必需的。