gpt4 book ai didi

module - 如何在 Racket 中获取自定义语言的命名空间?

转载 作者:行者123 更新时间:2023-12-04 16:55:39 26 4
gpt4 key购买 nike

我正在 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)

测试.rkt:

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com