Модули

Система модулей в Racket похожа на подобные системы в других языках. Каждый файл обычно содержит ровно один модуль:

; math.rkt
#lang racket

(define (sum a b) (+ a b))

По умолчанию все объявления, сделанные в модуле, остаются внутри модуля. Импорт объявлений из других модулей (читай “файлов”) происходит с помощью формы require:

(require "math.rkt")

Однако, вы не сможете использовать объявления другого модуля, если модуль не экспортирует их явно. Для экспорта объявлений используется форма provide:

; math.rkt
#lang racket

(provide sum)

(define (sum a b) (+ a b))

В provide перечисляются имена объявлений, которые нужно экспортировать. Любой другой модуль автоматически получает доступ ко всем экспортируемым объявлениям при импорте:

#lang racket

(require "math.rkt")

(define result (sum 5 3))

При экспорте можно так же указать форму (provide (all-defined-out)). Таким обазом мы экспортируем все объявления модуля.

Обратите внимание на следующие детали:

  • require работает с путями, ему можно передать как абсолютный так и относительный путь. В примере выше предполагается что оба модуля лежат в одной директории.

  • require автоматически делает доступным всё, что в импортируемом модуле указано в provide. Это бывает неудобно: во-первых, возможны конфликты имен, во-вторых, хочется явно понимать что откуда берется. Поэтому существует альтернативный способ вызова require:

(require (only-in "math.rkt" sum))

only-in говорит что надо включить из модуля "math.rkt" переменную sum и больше ничего. Для включения дополнительных объявлений достаточно добавить их имена в конец списка.

Задание

Экспортируйте объявление, которое есть в загруженном модуле


Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

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