我正在尝试使用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
即使是正确的功能,还是我的方法完全错了?
答案 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
。