Игнорирование определенных типов относительно = в OCaml - PullRequest
0 голосов
/ 05 сентября 2018

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

В частности, я вижу List.mem, возвращающих false, когда он должен возвращать true, поскольку он опирается на равенство.

Мне интересно, есть ли способ указать мне, что для любых двух значений моего типа местоположения = всегда должен возвращать true для любых двух значений этого типа?

Было бы много работы по рефакторингу всего компилятора для повсеместного использования пользовательского равенства, особенно потому, что многие полиморфные функции полагаются на возможность использовать = для любого типа.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Какая досадная проблема.

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

Одна из возможностей заключается в том, что большая часть компилятора вообще не использует местоположения. Если это так, возможно, вам удастся заменить все местоположения в AST тем же фиктивным местоположением. Это должно позволить равенству вести себя так, как если бы мест не было вообще. Это довольно странно и может оказаться невозможным, если позже в компиляторе используются какие-либо данные о местоположении.

«Чистым» решением является определение операции нормального равенства для AST (или получение операции с использованием ppx) и изменение кода для ее использования. Как вы говорите, это будет намного больше работы.

0 голосов
/ 05 сентября 2018

Не существует механизма OCaml, чтобы делать то, что вы хотите.

Вы можете использовать ppx для написания расширений синтаксиса OCaml, и (насколько я понимаю) поведение может зависеть от типов. Так что есть некоторый шанс, что вы можете заставить вещи работать таким образом. Но это не будет так просто, как вы просите. Я подозреваю, что вам нужно явно обрабатывать = и любые стандартные функции (например, List.mem), которые неявно используют =. (Обратите внимание, что у меня нет опыта работы с PPX.)

Я нашел описание PPX здесь: http://ocamllabs.io/doc/ppx.html

Многие опытные программисты на OCaml избегают использования встроенного полиморфного равенства, потому что его поведение часто удивляет. Так что в конце концов, возможно, стоит перейти к пользовательской функции сравнения.

...