作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Racket 中实现一种自定义语言,我想在其中提供一个 eval
绑定(bind)到此自定义语言的命名空间的过程。
我的lang.rkt:
#lang racket
(provide #%module-begin #%top #%datum #%app)
(provide quote)
(provide (rename-out [a b] [my-eval eval]))
(define-namespace-anchor anchor)
(define ns (namespace-anchor->namespace anchor)) ; wrong namespace
(define (my-eval x) (eval x ns))
(define a 1)
#lang s-exp "my-lang.rkt"
(eval 'a)
(eval 'b)
ns
是 my-lang.rkt 的命名空间,
(eval 'a)
评估为
1
而
(eval 'b)
失败。
ns
绑定(bind)到 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
关于module - 如何在 Racket 中获取自定义语言的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927786/
我是一名优秀的程序员,十分优秀!