Подтвердить что ты не робот

Как значения OCaml могут быть напечатаны за пределами верхнего уровня?

OCaml repl ( "toplevel" ) имеет богатую печать для любых типов, определяемых пользователем или иным образом. Возможно ли получить доступ к этой функциональности за пределами верхнего уровня, вместо того, чтобы писать полностью настраиваемый набор принтеров значений для одного собственного набора типов?

4b9b3361

Ответ 1

Симпатичное средство печати является частью библиотеки верхнего уровня. Источник находится в toplevel/genprintval.ml. Это понятно, учитывая, что для этого нужна информация о типе: вы не можете просто выбросить на него какую-либо ценность, выбор симпатичного принтера основан на типе.

Если вы хотите использовать этот код в своей программе, вам нужно будет связать его с библиотекой toplevel (toplevellib.cma) или скомпилировать в genprintval (что означает, что нужно собрать достаточно бит проверки типа для анализа типа, он может стать довольно большим).

В отладчике есть аналогичное средство (но не разделяющее код) (debugger/printval.ml и debugger/loadprinter.ml).

Существуют сторонние библиотеки, с которыми вы можете напрямую ссылаться и которые предоставляют объекты для печати. Extlib Std.dump обеспечивает очень грубое средство ( не основанный на типе). Deriving Джереми Яллоп и Джейк Донхем - другой подход. Этот элемент Caml Weekly News предлагает больше предложений.

Ответ 2

Библиотека OCaml Batteries Included содержит функцию dump в модуле BatPervasives. Он преобразует любое значение в строку и возвращает его. Вы можете увидеть его исходный код здесь. Выходной сигнал не будет идентичным объему, поскольку некоторая информация теряется во время выполнения, например. абстрактные конструкторы типа данных станут целыми числами.