我想让Racket来计算.kicad_mod文件的语法,这些文件是表单的s表达式数据:
(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]))))最后,在装货方面(虽然不是在石榴石市场,而是直接使用球拍解释器),什么东西起作用了:
;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-resolver2.
;main.rkt
#lang s-exp "kicad_mod.rkt"
(println module)在stdout上没有输出的结果
发布于 2016-05-22 14:40:10
苏加德让我走上了正确的轨道,尽管这不是一个完整的答案。
我所做的没有多大意义,因为我不理解#%module-begin的重新定义以及代码在什么环境下被调用。
如果您修改kicad_mod.rkt以包括像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...是在模块上下文中使用我们的新语言调用的,在表达式之前执行(如果您像soegaard最初的建议那样从expr中删除引号)。
我真正想要的是在此之前重新定义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与#lang s-exp正确地工作。您仍然需要#%module-begin绑定,即使此时如果您想使用#lang s-exp,它不会做任何事情。我肯定它以后会派上用场的。
发布于 2016-05-22 10:15:21
这不是一个答案,但我不能在注释中编写代码。
这看起来很奇怪-表达式不应该在输出中吗?
(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 ...))https://stackoverflow.com/questions/37368804
复制相似问题