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

Документация модуля Obj

Есть ли документация о модуле Obj? Я мог найти только список функций без описания...

(BTW: Я знаю, что это низкоуровневые функции, которые обычно не используются)

4b9b3361

Ответ 1

Да, это явно недокументировано нарочно. Для пяти видов использования Obj я вижу (или пишу сам, что более тревожно), два из них необоснованны, два из них - способ избежать более чистого изменения дизайна, которое было бы полезно в любом случае, и один из них подлинное "хорошее решение" для сложной проблемы.

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

Вот несколько законных применений Obj:

  • при компиляции программ Coq в программы OCaml; система типа Coq более мощная, она может печатать вещи, которые OCaml будет отклонять, поэтому переводчик Coq- > Ocaml вставляет Obj.magic вызовы, чтобы заставить OCaml принять его вывод.

  • при кодировании GADT в OCaml 3.x, которые его не поддерживали - они были добавлены к 4.00. Существует одна кодировка с равенством и функционалом на уровне модуля (см. этот пост или эта работа), но более общий (используется в генераторе парсера menhir, который является отличной заменой для ocamlyacc, см. этот документ (PDF)) использует Obj.magic

  • при сортировке данных с использованием какой-либо (самодельной) информации о времени выполнения. Модуль Marshal OCaml уже не является безопасным по типу (по понятной причине), и если вам нужен другой вид сортировки в другом контексте (например, в/из запросов и результатов для SQL-сервера, как это было в my macaque) вам понадобится какой-то небезопасный листинг.

Ответ 2

Модуль Obj в основном касается структуры и интерпретации значений OCaml в куче. Если вы хотите понять, что это значит, вы должны прочитать главу 18 руководства OCaml, "Взаимодействие C с Objective Caml".

Причина, по которой это недокументировано, двояка: во-первых, функции ужасно опасны. Нет простой функции с типом 'a -> 'b, поэтому вы можете видеть, что Obj.magic должен сделать совсем немного, если вообще что-то вернуть. На самом деле это всего лишь дыра в системе типов, "лицензия на ее уничтожение". Во-вторых, модуль позволяет вам заглянуть и потащить в кучу по желанию, фактически предоставив моральный эквивалент C-указателям на пустоту. Это вместе с неограниченными настройками позволяет делать то, что вы хотите от OCaml.

Существуют законные применения для Obj. Я подсчитываю более 100 вхождений Obj.magic в источниках, особенно в коде для Printf и Scanf. Другое законное использование - это операции с хвостовым рекурсивным списком, если вы можете доказать, что код безопасен по типу и потокобезопасен.

Если вы не возражаете против самозапуска, вот пример небезопасной операции, которая завернута в безопасный интерфейс, вместе с доказательством ( "Поскольку на каждом шаге ячейка cons является свежей..." ), что она действительно безопасна, и вот еще один.

Ответ 3

Вы не найдете документации для этих функций. Если вы хотите использовать их, и я не буду повторять, что это обескуражено, вы должны прочитать и понять их реализацию. Но, как я помню, три из них реализованы как "% идентичности", поэтому это не так сложно, как кажется.