【发布时间】: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 中以球拍模式在当前文件中加载子模块?
例如,如果我有以下文件
#lang racket
(define (foo x)
x)
(module+ sub
(define (bar x y)
x))
我在球拍模式下按 f5 启动 repl,然后 foo 可用,但 bar 不可用。
【问题讨论】:
它在 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
【讨论】:
您可以结合使用dynamic-enter! 和quote-module-path 来执行此操作。
鉴于您发布的上述代码的 repl 交互:
> (require racket/enter syntax/location)
> (dynamic-enter! (quote-module-path sub))
> bar
#<procedure:bar>
或者,您可以使用 dynamic-require/expose(公开部分允许您需要未提供的内容),就像 here 所做的那样。
【讨论】:
racket-run 现在运行最里面的子模块封闭点。
module+, (2) errortrace 即 racket-error-context 而不是 'low 或 'medium, 则模块定义将不可用, and (3) Racket 6.2.1 或更早版本。但是,如果没有这些条件中的任何一个,它就会起作用。 TL;DR 它始终适用于 Racket HEAD。