如何(重新)加载Racket(X)REPL中的文件?

Con*_*ion 8 scheme load racket read-eval-print-loop

假设我有一个类似的文件

#lang racket/base
(define (hello) (print "Hello"))
... more definitions ...
Run Code Online (Sandbox Code Playgroud)

我想在文件中加载定义,以交互方式在(X)REPL中使用它们.我怎么做?

如果我启动(X)REPL (load "/tmp/hello.rkt"),那么该hello函数不可用于我:

-> (hello)
; hello: undefined;
Run Code Online (Sandbox Code Playgroud)

如果我(require (file "/tmp/hello.rkt")),结果是一样的.现在我可以 (enter! (file "/tmp/hello.rkt")),然后(hello)工作,但这似乎相当......不直观和初学者不友好.

这确实是应该这样做的方式吗?我应该简单地阅读模块和命名空间以轻松浏览和试验我的代码,还是有一种更简单的方法可以忽略?

注意我发现如何通过命令行将文件加载到球拍?,但这只解释了如何运行该文件.不是如何在REPL中加载它,因此您可以测试/调试某些特定的定义,然后编辑,重新加载等.

Eli*_*lay 10

由于以文件开头的文件#lang是模块,因此如果load它们没有任何作用.(实际上它可以做些什么,但可能不会对你有所帮助.)最好避免load完全使用,只是假装它不在那里.

现在,使用require是正确的,但它的作用是实例化模块并让您访问它提供的名称.在您的情况下,您没有提供任何意味着您不能使用您的hello.为此,您可以添加(provide hello)到该文件.但这可能不是你想要的,因为你似乎想调试代码.(即,你不会希望provide你的模块中的所有东西只是为了处理事情.)

所以正确使用的是enter!,或者如果你使用xrepl,那么这是一个更方便的,en命令.这将实例化模块并使repl使用模块的命名空间,因此您可以访问所有内容.(并且您不需要loadrequire它.)如果您更改代码,您也可以多次使用它来重新加载代码.但请注意,它存在一些问题,因此您可能需要安装每晚构建才能使用它.

最后,您可能知道这一点,但与DrRacket合作将使事情变得更加容易.