Загрузка данных


% Лабораторная работа № 2. Типы данных. Модульное тестирование
% Лабораторная ещё не сдана
% Кирилл Меньшиков, ИУ9-12/6

Цель работы

На практике ознакомиться с системой типов языка Scheme, модульным тестированием, средствами отладки программ и средствами метапрограммирования языка Scheme.

Индивидуальный вариант

1. Реализовать процедуру "reverse!" для деструктивного обращения списков, векторов и строк с поддержкой необязательного приёмника.
2. Разработать наборы модульных тестов и реализовать процедуру "factorize" для разложения разности квадратов, разности кубов и суммы кубов на множители.

Реализация

Макрос trace

Макрос "trace" выводит исходное выражение, вычисляет его один раз, выводит полученное значение и возвращает его в программу.

(define-syntax trace
  (syntax-rules ()
    ((trace expr)
     (begin
       (write 'expr)
       (display " => ")
       (let ((value expr))
         (display value)
         (newline)
         value)))))

Модульное тестирование

Макрос "test" сохраняет выражение в виде данных, создаёт процедуру для его вычисления и сохраняет ожидаемый результат.

Процедура "run-test" выполняет один тест и возвращает "#t" или "#f". Для сравнения фактического и ожидаемого результатов используется "equal?".

Процедура "run-tests" запускает весь список тестов и возвращает "#t", если все проверки прошли успешно.

Полные определения макроса "test" и процедур "run-test", "run-tests" приведены в исходном файле "unit-test.scm".

Процедура reverse!

Процедура "reverse!" поддерживает списки, векторы и строки. При вызове с одним аргументом она изменяет последовательность на месте. При вызове с двумя аргументами она записывает элементы в обратном порядке в приёмник.

Для изменения списков используются операции "set-car!" и "set-cdr!", для векторов — "vector-set!", для строк — "string-set!".

Полное определение процедуры приведено в исходном файле "reverse.scm".

Процедура factorize

Процедура "factorize" преобразует выражения следующих типов:

- Разность квадратов: "a² − b² = (a − b)(a + b)".
- Разность кубов: "a³ − b³ = (a − b)(a² + ab + b²)".
- Сумма кубов: "a³ + b³ = (a + b)(a² − ab + b²)".

Результат строится как список Scheme, содержащий оператор и операнды. Для построения используются "list" и операции доступа к элементам списка. Полученное выражение можно вычислить при помощи "eval".

Полное определение процедуры приведено в исходном файле "factorize.scm".

Тестирование

Тесты проверяют корректность макроса "trace", каркаса модульного тестирования, процедуры "reverse!" и процедуры "factorize".

Для "reverse!" проверяются списки, векторы, строки и использование отдельного приёмника. Для "factorize" проверяются все три формулы и вычисление результата через "eval".

Результаты тестирования необходимо дополнить фактическим выводом интерпретатора Scheme после запуска "tests.scm".

Вывод

В ходе лабораторной работы были изучены средства метапрограммирования Scheme и реализованы макросы для трассировки и модульного тестирования. Были рассмотрены отложенное вычисление выражений, сравнение структурных данных и организация серии автоматических проверок.

Также были изучены изменяемые структуры данных Scheme и реализованы процедуры для обращения последовательностей и преобразования алгебраических выражений. Написанные тесты позволяют проверять корректность реализаций и выявлять ошибки при изменении исходного кода.