【问题标题】:Racket REPL and SubmodulesRacket REPL 和子模块
【发布时间】:2015-11-18 01:41:31
【问题描述】:

我有没有一种简单的方法可以在 emacs 中以球拍模式在当前文件中加载子模块?

例如,如果我有以下文件

#lang racket

(define (foo x)
  x)

(module+ sub
  (define (bar x y)
    x))

我在球拍模式下按 f5 启动 repl,然后 foo 可用,但 bar 不可用。

【问题讨论】:

    标签: emacs racket


    【解决方案1】:

    它在 DrRacket 中的工作方式相同。你必须从子模块provide bar 和require 子模块使用它。试试下面的代码:

    #lang racket
    
    (define (foo x)
      x)
    
    (module+ sub
      (define (bar x y)
        x)
      (provide bar))
    
    ;; (bar 1 2) -- undefined
    
    (require (submod "." sub))
    (bar 1 2) ;; -- works here
    

    【讨论】:

      【解决方案2】:

      您可以结合使用dynamic-enter!quote-module-path 来执行此操作。

      鉴于您发布的上述代码的 repl 交互:

      > (require racket/enter syntax/location)
      > (dynamic-enter! (quote-module-path sub))
      > bar
      #<procedure:bar>
      

      或者,您可以使用 dynamic-require/expose(公开部分允许您需要未提供的内容),就像 here 所做的那样。

      【讨论】:

      • 感谢您回答这个问题,雷夫!我刚刚为此打开了issue 151
      • 我刚刚合并了一个提交到 master,应该很快就会流向 MELPA。 racket-run 现在运行最里面的子模块封闭点。
      • 我应该提一下,如果您使用 (1) module+, (2) errortrace 即 racket-error-context 而不是 'low'medium, 则模块定义将不可用, and (3) Racket 6.2.1 或更早版本。但是,如果没有这些条件中的任何一个,它就会起作用。 TL;DR 它始终适用于 Racket HEAD。
      猜你喜欢
      • 2011-10-13
      • 2013-05-17
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2014-11-04
      • 1970-01-01
      相关资源
      最近更新 更多