Racket: Модули
Система модулей в 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 и больше ничего. Для включения дополнительных объявлений достаточно добавить их имена в конец списка.
Задание
Экспортируйте объявление, которое есть в загруженном модуле.
Racket: Модули
Система модулей в 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 и больше ничего. Для включения дополнительных объявлений достаточно добавить их имена в конец списка.
Задание
Экспортируйте объявление, которое есть в загруженном модуле.
Ваше упражнение проверяется по этим тестам
#lang racket
(require (only-in rackunit check-equal? test-begin))
(require "index.rkt")
(test-begin
(check-equal? telephone "iphone"))Решение учителя откроется через:
20:00
