Racket REPL和子模块

7
有没有一种简单的方法可以在emacs的racket-mode中加载当前文件中的子模块?
例如,如果我有以下文件:
#lang racket

(define (foo x)
  x)

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

我在 racket-mode 中按下 F5 键启动 repl,此时 foo 可用但 bar 不可用。

2个回答

5
你可以结合使用 dynamic-enter!quote-module-path 来完成此操作。
假设你贴出了上述代码的 repl 交互:
> (require racket/enter syntax/location)
> (dynamic-enter! (quote-module-path sub))
> bar
#<procedure:bar>

或者,您可以使用dynamic-require/expose(expose 部分允许您要求未提供的内容),如此处所做(这里)


1
谢谢你的回答,Leif!我刚刚为此打开了问题151 - Greg Hendershott
1
我刚刚将一个提交合并到主分支,很快就会流向MELPA。racket-run现在运行包含光标所在位置的最内层子模块。 - Greg Hendershott
我应该提到,如果你使用 (1) module+,(2) racket-error-context 除了 'low'medium 以外的其他选项,以及 (3) Racket 6.2.1 或更早版本,则模块定义将不可用。但是,如果这些条件中有任何一个不存在,则它可以正常工作。简而言之,在 Racket HEAD 上始终可以正常工作。 - Greg Hendershott

0

在DrRacket中,它的工作方式是相同的。您必须从子模块中提供 bar,并要求使用该子模块。尝试以下代码:

#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接