Включая файлы из ракетки / схемы - PullRequest
4 голосов
/ 25 января 2012

Я пытаюсь использовать дрракет для выполнения упражнений в "Как Дизайн-программы 2nd Ed ".

Ряд упражнений в этом упражнении основан на ответах на предыдущие вопросы, поэтому я хотел бы включить исходные файлы из ответил на вопросы, чтобы мне не пришлось копировать и вставлять тело старого ответа каждый раз.

Мой главный вопрос: как мне это сделать?

Я просмотрел документацию и нашел метод под названием 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 Ответ

8 голосов
/ 25 января 2012

Форма include не работает, потому что, если для языка задано значение «Начинающий студент» или один из других языков обучения, DrRacket фактически оборачивает вашу программу в модуль. Вы можете увидеть это, если откроете "test.rkt" в обычном текстовом редакторе. Бит #reader.... - это то, что генерирует модуль. Но когда это получает included в другой файл, это не имеет смысла. Таким образом ошибка жалуется на module.

К сожалению, насколько я могу судить, языки HtDP до сих пор не имеют provide, и это то, что вам нужно для правильной работы.

Если вы действительно хотите, чтобы это сработало, вот способ взломать его:

Создайте новый файл с именем "provide.rkt" в том же каталоге, что и другие ваши файлы. Пока вы редактируете этот файл (и только этот файл), установите «Язык в DrRacket» на «Определить язык из источника». Поместите следующие две строки в "provide.rkt":

#lang racket
(provide provide)

(Это объявляет модуль, использующий полный язык Racket, который предоставляет только встроенную специальную форму provide.)

Добавьте следующие строки в вашу программу "test.rkt". (Убедитесь, что язык DrRacket установлен на «Beginning Student» или на любой язык обучения, который вы используете для этого.)

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

Теперь "test.rkt" - это модуль, который экспортирует вашу функцию test. (Это всегда был модуль, раньше у него не было экспорта, поэтому он был не очень полезен.)

Добавьте следующие строки в вашу программу "newtest.rkt":

(require "test.rkt")

Это импортирует все, что предусмотрено "test.rkt": в настоящее время просто test, но вы можете добавить другие вещи, вам просто нужно provide их.

...