在Racket中重新绑定名称`module`

时间:2016-05-21 22:56:26

标签: scheme racket require

我想让Racket评估作为以下格式的s表达式数据的.kicad_mod文件的语法:

(module LED-10MM (layer F.Cu) (tedit 55BDE3C5)
  (descr "LED 10mm")
  ...)

full file here

我希望能够混合使用Racket和" kicad_mod"语法所以我试图重新定义module函数。作为一个开始,我尝试了:

;kicad_mod.rkt

#lang racket
(provide
 (except-out (all-from-out racket) #%module-begin module)
 (rename-out [module-begin #%module-begin]))

(define kicad_module "you got me")

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))))

在装载方面最终有什么工作(虽然不是在drracket但是带有球拍翻译):

;main.rkt

#lang racket
(module kicad_mod "kicad_mod.rkt")
(require 'kicad_mod)
(println module)
; => "you got me"

但如果我尝试任何其他方式,它会失败:

1。

;main.rkt

#lang racket
(require "kicad_mod.rkt")` 

导致错误:

 main.rkt:3:9: module: bad syntax
      in: module
      context...:
       standard-module-name-resolver

2

;main.rkt

#lang s-exp "kicad_mod.rkt"
(println module)

导致stdout没有输出

2 个答案:

答案 0 :(得分:1)

这不是答案,但我无法在评论中编写代码。

这看起来很奇怪 - 表达式不应该在输出中吗?

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))))

也许

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   expr ...))

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   'expr ...))

答案 1 :(得分:0)

soegaard put me on the right track尽管它不是一个完整的答案。

我所做的事情并没有多大意义,因为我没有理解#%module-begin重新定义以及在什么情况下调用代码。

如果您修改kicad_mod.rkt以包含引用的expr,如soegaard建议:

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   'expr ...))

并且:

;main.rkt
#lang s-exp "kicad_mod.rkt"
(println module)

您实际上在stdout上获得了'(println module)的输出。所以(provide (rename-out...是在模块的上下文中使用我们的新语言调用的,在表达式之前执行(如果你从expr中删除引用,就像soegaard的初始建议那样)。

我真正想要的是在此之前重新定义module,同时重新定义#%module-begin

;kicad_mod.rkt

#lang racket
(provide
 (except-out (all-from-out racket) #%module-begin module)
 (rename-out [module-begin #%module-begin])
 (rename-out [kicad_module module]))

(define kicad_module "you got me")

(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   expr ...))

使用上面main.rkt的{​​{1}}可以正常使用。您仍然需要#lang s-exp绑定,即使您想要使用#%module-begin,此时也无法执行任何操作。不管怎样,我相信它会派上用场,我相信。