Scheme宏中的任意计算

时间:2010-11-08 10:36:24

标签: macros scheme racket

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

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

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

结果似乎是在宏处理之前你无法定义命名函数。

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

1 个答案:

答案 0 :(得分:7)

是的,你使用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"))进行操作。