我需要读取一个球拍源文件,并通过宏展开运行它。我有一个简单的测试文件,它自己很高兴地接受:
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]因此,看起来相同的代码交互工作,但在程序中不起作用。我遗漏了什么?
发布于 2016-06-23 09:11:58
您需要指定用于查找顶级变量(即程序中未绑定的变量)的名称空间expand。
例如:
(parameterize ([current-namespace (make-base-namespace)])
(expand ...))有关更多信息,请参见下面文件中的注释,在该文件中,我试图解释名称空间之间的关系并展开:
https://github.com/soegaard/meta/blob/master/runtime/racket-eval.rkt#L122
发布于 2016-06-23 13:14:52
@soegaard的回答解决了当前的问题,但是如果您想要一个从原语重新实现扩展的全面程序,您可以查看
https://github.com/samth/pycket/blob/master/pycket/pycket-lang/expand.rkt
https://stackoverflow.com/questions/37986711
复制相似问题