Module 如何在Racket中获取自定义lang的名称空间?
我在Racket中实现了一种自定义语言,我想在其中提供一个绑定到此自定义语言名称空间的Module 如何在Racket中获取自定义lang的名称空间?,module,namespaces,racket,eval,Module,Namespaces,Racket,Eval,我在Racket中实现了一种自定义语言,我想在其中提供一个绑定到此自定义语言名称空间的eval过程 my-lang.rkt: #朗球拍 (提供#%module begin#%top#%datum#%app) (提供报价) (提供(重命名为[a b][my eval eval])) (定义名称空间锚定) (定义ns(名称空间定位->名称空间定位));错误的名称空间 (定义(我的评估x)(评估x N)) (定义a 1) test.rkt: #lang s-exp“my-lang.rkt” (评估a
eval
过程
my-lang.rkt:
#朗球拍
(提供#%module begin#%top#%datum#%app)
(提供报价)
(提供(重命名为[a b][my eval eval]))
(定义名称空间锚定)
(定义ns(名称空间定位->名称空间定位));错误的名称空间
(定义(我的评估x)(评估x N))
(定义a 1)
test.rkt:
#lang s-exp“my-lang.rkt”
(评估a)
(评估b)
在实现时,由于ns
是my-lang.rkt的命名空间,(eval'a)
的计算结果为1
,而(eval'b)
失败
我希望将ns
绑定到test.rkt的命名空间,以便(eval'a)
失败并且(eval'b)
返回1
我应该如何定义
ns
?这里有一种使用参数和宏的方法。也许有更好的方法:
;; my-lang.rkt
#lang racket
(provide #%top #%datum #%app (rename-out [@#%module-begin #%module-begin])
quote
(rename-out [a b] [my-eval eval]))
(require syntax/parse/define
racket/splicing)
(define current-ns (make-parameter #f))
(define-syntax-parser @#%module-begin
[(_ . xs)
#'(#%module-begin
(define-namespace-anchor anchor)
(splicing-parameterize ([current-ns (namespace-anchor->namespace anchor)])
. xs))])
(define (my-eval x) (eval x (current-ns)))
(define a 1)
;; test.rkt
#lang s-exp "my-lang.rkt"
(eval 'b) ;=> 1
(eval 'a)
;; a: undefined;
;; cannot reference an identifier before its definition