(Racket)“无法在定义之前引用标识符”,并从模块导入标识符

时间:2013-09-05 18:27:27

标签: module racket

我有一个文件“exceptions.rkt”

#lang racket
(module exceptions racket
  (provide Macro/Raise Macro/Assert Macro/Assert* Macro/Domain-Assert)

; ... Definitions for provided symbols...

) ; End of module, end of file

Macro/Raise等实际上不是用define-syntax定义的宏,它们只是用syntax-rules生成的一元函数并且分配了一个名称

(define Macro/Raise
  (syntax-rules ()
; ... body not important ...
))

和“exceptions.rkt”在同一文件夹中,我有一个文件“tables.rkt”。

#lang racket
(module tables racket
    (require "exceptions.rkt")
    (define-syntax Assert Macro/Assert)

; ... more stuff...

) ; End of module, end of file

但这导致Macro/Assert: undefined; cannot reference an identifier before its definition in module: 'tables phase: 1

我已经尝试过阅读文档而无法弄清楚我做错了什么......那我做错了什么?

2 个答案:

答案 0 :(得分:3)

为了在宏定义阶段使用定义,请使用for-syntax

(require (for-syntax "exceptions.rkt"))

答案 1 :(得分:0)

此外,由于(module exceptions racket ...)已生成模块,因此您不需要#lang racket包装代码。