Module 如何在Racket中获取自定义lang的名称空间?

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

我在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)
(评估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