OCaml repl ( "toplevel" ) имеет богатую печать для любых типов, определяемых пользователем или иным образом. Возможно ли получить доступ к этой функциональности за пределами верхнего уровня, вместо того, чтобы писать полностью настраиваемый набор принтеров значений для одного собственного набора типов?
Как значения OCaml могут быть напечатаны за пределами верхнего уровня?
Ответ 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. Он преобразует любое значение в строку и возвращает его. Вы можете увидеть его исходный код здесь. Выходной сигнал не будет идентичным объему, поскольку некоторая информация теряется во время выполнения, например. абстрактные конструкторы типа данных станут целыми числами.