racket - 读取并扩展 Racket 源文件

标签 racket

我需要读取一个 Racket 源文件并通过宏扩展来运行它。我有一个简单的测试文件,Racket 本身很乐意接受:

C:\ayane>type factorial.rkt
#lang racket
(provide factorial)

(define (factorial n)
 (if (<= n 1)
  1
  (* n (factorial (sub1 n)))))

现在我从 REPL 尝试:

C:\ayane>racket
Welcome to Racket v6.5.
> (read-accept-reader #t)
> (expand (with-input-from-file "factorial.rkt" (lambda () (read-syntax "factorial.rkt"))))
#<syntax::1 (module factorial racket (#%m...>

到目前为止一切顺利。现在来自测试程序的同样的事情:

C:\ayane>type test.rkt
#lang racket
(read-accept-reader #t)
(expand (with-input-from-file "factorial.rkt"
                              (lambda ()
                               (read-syntax "factorial.rkt"))))

C:\ayane>racket test.rkt
factorial.rkt::1: module: unbound identifier;
 also, no #%app syntax transformer is bound
  at: module
  in: (module factorial racket (#%module-begin (provide factorial) (define (factorial n) (if (<= n 1) 1 (* n (factorial (sub1 n)))))))
  context...:
   C:\ayane\test.rkt: [running body]

所以看起来相同的代码可以交互工作,但不能在程序中工作。我错过了什么?

最佳答案

您需要指定 expand 应该使用哪个命名空间来查找顶级变量(即未在程序中绑定(bind)的变量)。

例如:

 (parameterize ([current-namespace (make-base-namespace)])
     (expand ...))

有关详细信息,请参阅下面文件中的注释,其中我尝试解释命名空间和展开之间的关系:

https://github.com/soegaard/meta/blob/master/runtime/racket-eval.rkt#L122

关于racket - 读取并扩展 Racket 源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37986711/

相关文章:

scheme - 加法在 Racket /方案中是如何工作的?

lambda - 对 let 到 lambda 的转换感到困惑

scheme - 模块中的未绑定(bind)标识符 - DrRacket

serialization - 如何从 Racket 中的文件中读取集合?

macros - 我可以制作一个扩展为多个值的宏吗?

scheme - SICP视频讲座2

javascript - Racket(方案)中的arguments.callee?

user-interface - 使用 Racket 创建新的 snip%

scheme - Racket博士和R5RS方案: (current-directory) is not working

list - 如何使用递归删除 Racket 列表中的第一个和最后一个元素