Документация модуля Obj - PullRequest
14 голосов
/ 19 мая 2011

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

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

Ответы [ 3 ]

17 голосов
/ 19 мая 2011

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

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

Вот несколько допустимых вариантов использования Obj:

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

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

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

10 голосов
/ 19 мая 2011

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

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

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

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

3 голосов
/ 19 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...