首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新绑定球拍中的名称“`module`”

重新绑定球拍中的名称“`module`”
EN

Stack Overflow用户
提问于 2016-05-21 22:56:26
回答 2查看 77关注 0票数 1

我想让Racket来计算.kicad_mod文件的语法,这些文件是表单的s表达式数据:

代码语言:javascript
复制
(module LED-10MM (layer F.Cu) (tedit 55BDE3C5)
  (descr "LED 10mm")
  ...)

完整文件在这里

我希望能够混合Racket和"kicad_mod“语法,所以我尝试重新定义module函数。首先,我试了一下:

代码语言:javascript
复制
;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]))))

最后,在装货方面(虽然不是在石榴石市场,而是直接使用球拍解释器),什么东西起作用了:

代码语言:javascript
复制
;main.rkt

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

但如果我尝试其他方法,它失败了:

1.

代码语言:javascript
复制
;main.rkt

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

导致错误:

代码语言:javascript
复制
 main.rkt:3:9: module: bad syntax
      in: module
      context...:
       standard-module-name-resolver

2.

代码语言:javascript
复制
;main.rkt

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

在stdout上没有输出的结果

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-22 14:40:10

苏加德让我走上了正确的轨道,尽管这不是一个完整的答案。

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

如果您修改kicad_mod.rkt以包括像soegaard所建议的引用的费用:

代码语言:javascript
复制
(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   'expr ...))

并拥有:

代码语言:javascript
复制
;main.rkt
#lang s-exp "kicad_mod.rkt"
(println module)

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

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

代码语言:javascript
复制
;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,它不会做任何事情。我肯定它以后会派上用场的。

票数 1
EN

Stack Overflow用户

发布于 2016-05-22 10:15:21

这不是一个答案,但我不能在注释中编写代码。

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

代码语言:javascript
复制
(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))))

也许吧

代码语言:javascript
复制
(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   expr ...))

代码语言:javascript
复制
(define-syntax-rule (module-begin expr ...)
  (#%module-begin
   (provide (rename-out [kicad_module module]))
   'expr ...))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37368804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档