包括球拍/方案内的文件

时间:2012-01-25 00:33:31

标签: scheme racket

我正在尝试使用drracket通过“如何做”练习 设计课程第二版“。

这方面的一些练习建立在以前的答案上 问题,所以我想包括来自的源文件 回答问题,以便我不必复制和粘贴身体 每次回答旧答案。

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

我查看了文档并找到了一个名为的方法 include似乎做了我想做的事,但我不知道如何使用 它正确。

例如 - 我有两个文件:

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

(define (test) 1)
(test)

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

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

(define (newtest)  (* test 2))

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

module: this function is not defined

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

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

1 个答案:

答案 0 :(得分:8)

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

不幸的是,据我所知,HtDP语言仍然没有provide,这正是你需要做的工作。

如果你真的想要让它发挥作用,这是一种破解它的方法:

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

#lang racket
(provide provide)

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

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

(require "provide.rkt")
(provide test)

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

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

(require "test.rkt")

导入"test.rkt"提供的所有内容:目前只有test,但您可以添加其他内容,只需要provide