Emacs racketrepl和子模块

Emacs racketrepl和子模块,emacs,racket,Emacs,Racket,有没有一种简单的方法可以让我在emacs中以racket模式加载当前文件中的子模块 例如,如果我有以下文件 #lang racket (define (foo x) x) (module+ sub (define (bar x y) x)) 我在racket模式下按f5启动repl,然后foo可用,但bar不可用。它在DrRacket中的工作方式相同。您必须提供子模块中的条,并且要求子模块使用它。请尝试以下代码: #lang racket (define (foo x)

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

例如,如果我有以下文件

#lang racket

(define (foo x)
  x)

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

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

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

#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
您可以组合和来执行此操作

给定您发布的上述代码的repl交互:

> (require racket/enter syntax/location)
> (dynamic-enter! (quote-module-path sub))
> bar
#<procedure:bar>
>(需要球拍/输入语法/位置)
>(动态输入!(引用模块路径子节点))
>酒吧
#

或者,您可以按原样使用(暴露部分允许您要求未提供的内容)。

谢谢您的回答,Leif!我刚刚为此打开了一个窗口。我刚刚合并了一个提交给master的文件,应该很快就会传递给MELPA<代码>球拍运行
现在运行最里面的子模块封闭点。我应该指出,如果您使用(1)
模块+
,(2)错误跟踪,即
球拍错误上下文
而不是
'低
'中
,以及(3)球拍6.2.1或更早版本,则模块定义将不可用。但是,如果不存在这些条件中的任何一个,它都可以工作。TL;它总是在拍头上起作用。