我想让Racket评估作为以下格式的s表达式数据的.kicad_mod文件的语法:
(module LED-10MM (layer F.Cu) (tedit 55BDE3C5)
(descr "LED 10mm")
...)
我希望能够混合使用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"
但如果我尝试任何其他方式,它会失败:
;main.rkt
#lang racket
(require "kicad_mod.rkt")`
导致错误:
main.rkt:3:9: module: bad syntax
in: module
context...:
standard-module-name-resolver
;main.rkt
#lang s-exp "kicad_mod.rkt"
(println module)
导致stdout没有输出
答案 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
,此时也无法执行任何操作。不管怎样,我相信它会派上用场,我相信。