【问题标题】:Rebinding the name `module` in Racket在 Racket 中重新绑定名称“模块”
【发布时间】:2016-05-21 22:56:26
【问题描述】:

我想让 Racket 评估 .kicad_mod 文件的语法,这些文件是以下形式的 s 表达式数据:

(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)

导致标准输出没有输出

【问题讨论】:

    标签: scheme racket require


    【解决方案1】:

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

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

    (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 ...))
    

    ?

    【讨论】:

    【解决方案2】:

    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)
    

    您实际上在标准输出上得到了'(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 ...))
    

    在上面使用#lang s-expmain.rkt 可以正常工作。您仍然需要#%module-begin 绑定,即使如果您想使用#lang s-exp,它此时不会做任何事情。反正以后会派上用场的,我敢肯定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多