包括球拍/方案内的文件

Dav*_*lie 4 scheme racket

我正在尝试使用drracket通过"如何设计程序第二版"中的练习来工作.

这里的一些练习建立在前面问题的答案上,所以我想从已回答的问题中包含源文件,这样我就不必每次都复制并粘贴旧答案的正文.

我的主要问题是:我该怎么做?

我通过文档看了一下,发现一个叫做的方法 include似乎做了我想要的,但我无法弄清楚如何正确使用它.

例如 - 我有两个文件:

test.rkt - 这个编译并运行正常并包含一个函数:

(define (test) 1)
(test)
Run Code Online (Sandbox Code Playgroud)

newtest.rkt - 我希望这个文件能够使用test.rkt中定义的函数.

(require racket/include)
(include "test.rkt")

(define (newtest)  (* test 2))
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到以下错误:

module: this function is not defined
Run Code Online (Sandbox Code Playgroud)

(信息量不大,但这是我给出的所有信息......)

如何在不收到此错误的情况下将第一个文件包含在内?是include 即使是在这个正确的功能,或者是我的方法完全错了吗?

Rya*_*per 8

include形式不工作,因为当语言设置为"初学者"或其他教学语言之一,DrRacket实际上是一个模块在包装程序.如果您"test.rkt"在常规文本编辑器中打开,则可以看到此信息.该#reader....位是生成模块的原因.但当它included进入另一个文件时,它没有意义.因此错误抱怨module.

不幸的是,据我所知,HtDP语言仍然没有provide,这就是你需要使这项工作正常运行的.

如果你真的想让这个工作,这里有一种方法可以解决它:

创建一个"provide.rkt"与其他文件在同一目录中调用的新文件.在编辑此文件(仅此文件)时,请将DrRacket中的语言设置为"从源确定语言".将以下两行放入"provide.rkt":

#lang racket
(provide provide)
Run Code Online (Sandbox Code Playgroud)

(它声明了一个使用完整Racket语言的模块,该语言​​仅提供内置的特殊形式provide.)

将以下行添加到您的"test.rkt"程序中.(确保DrRacket的语言设置回"初学者"或您正在使用的任何教学语言.)

(require "provide.rkt")
(provide test)
Run Code Online (Sandbox Code Playgroud)

现在"test.rkt"是一个导出你的test功能的模块.(它总是一个模块,它之前没有任何出口,所以它不是很有用.)

将以下行添加到您的"newtest.rkt"程序:

(require "test.rkt")
Run Code Online (Sandbox Code Playgroud)

导入的所有东西"test.rkt":目前只是test,但你可以添加其他东西,你只需要provide它们.