首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取和展开Racket源文件

读取和展开Racket源文件
EN

Stack Overflow用户
提问于 2016-06-23 08:53:55
回答 2查看 182关注 0票数 2

我需要读取一个球拍源文件,并通过宏展开运行它。我有一个简单的测试文件,它自己很高兴地接受:

代码语言:javascript
复制
C:\ayane>type factorial.rkt
#lang racket
(provide factorial)

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

现在我从REPL尝试:

代码语言:javascript
复制
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...>

到目前一切尚好。现在,测试程序中的相同内容:

代码语言:javascript
复制
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]

因此,看起来相同的代码交互工作,但在程序中不起作用。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-23 09:11:58

您需要指定用于查找顶级变量(即程序中未绑定的变量)的名称空间expand

例如:

代码语言:javascript
复制
 (parameterize ([current-namespace (make-base-namespace)])
     (expand ...))

有关更多信息,请参见下面文件中的注释,在该文件中,我试图解释名称空间之间的关系并展开:

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

票数 5
EN

Stack Overflow用户

发布于 2016-06-23 13:14:52

@soegaard的回答解决了当前的问题,但是如果您想要一个从原语重新实现扩展的全面程序,您可以查看

https://github.com/samth/pycket/blob/master/pycket/pycket-lang/expand.rkt

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37986711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档