Печать пользовательских типов в ReasonML - PullRequest
2 голосов
/ 25 октября 2019

Существует ли простой способ для общей печати пользовательских типов или вложенных списков в ReasonML?

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

Мой текущий обходной путь: я выписал различные процедуры ожидания проверки в зависимости от типа, который они принимают (например, checkExpectListLists, который отображает каждый из вложенных списков и рекурсивно печатает аргументы.)

Потенциальная помощь: Sketch.sh может оценивать и распечатывать результаты вызовов функций даже с пользовательскими типами. Кто-нибудь знает, как они это делают / как я могу использовать эту функциональность в моем чеке и ожидать печати?

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2019

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

Таким образом, вам нужно хранить больше информации о кодах ваших учеников до оценки.

Один из способов сделать это -используйте сеанс верхнего уровня, как это делает Sketch. Поскольку Repl имеет доступ к определениям типов, он может использовать эту информацию для печати любых пользовательских типов. Самый простой способ настройки - запустить процесс OCaml Repl и использовать его для проверки и печати кода ученика. Немного более сложная возможность, но в конечном итоге обеспечивающая больший контроль, заключалась бы в непосредственном использовании библиотеки компиляторов OCaml. Затем вы должны инициализировать сеанс REPL, добавить некоторые перенаправления потока. Как только это будет сделано, вы можете оценивать код вашего студента фразу за фразой, просматривая существующие значения в среде ...

Другой ортогональный способ - это проанализировать код вашего студента и добавить pretty-printer к определениям каждого типа. ,Это можно сделать с помощью инфраструктуры ppx. Например, вы можете написать собственный ppx, который добавляет производную аннотацию к определениям каждого типа. Вы также можете искать тестируемую функцию и добавлять к ней некоторые инструменты.

...