Есть ли средство отображения ppx, которое реализует альфа-переименование?
Я пишу какое-то расширение ppx, и мне было интересно, существует ли где-нибудь инструмент или функция, которые позволяют работать в Parsetree с уникальными идентификаторами.
Например, я хотел бы иметь возможность комментировать объявление let x = ...
таким образом, что каждый раз x
используется, я могу выполнить определенную задачу. Однако выполнение этого синтаксически вызывает проблему, например:
let z = 42 in
let f x = x + z in
let z = 0 in
f z
Где два первых появления z
не относятся к двум колодам. В следующем примере больше нет двусмысленностей:
let z1 = 42 in
let f x = x + z1 in
let z2 = 0 in
f z2
Так что я хочу, чтобы это преобразование происходило автоматически или каким-то образом обходило эту проблему. Я могу придумать два способа сделать это:
- либо ppx, который выполняет альфа-переименование, чтобы дать уникальные идентификаторы каждому именованному значению. Однако это может усложнить отладку, так как приведет к созданию новых идентификаторов, которых нет в исходном исходном коде.
- либо где-то есть контекст, который отслеживает текущую область видимости: например, средство сопоставления, которое каждый раз, когда новое имя добавляется в среду, связывает с ним уникальный идентификатор. Тогда пользователю придется сравнивать идентификаторы, а не только имена.
Итак, мой вопрос состоит из трех частей:
- Есть ли такой инструмент / библиотека / функция?
- Если нет, возможно ли / полезно ли это иметь?
- Если да, то как лучше всего это сделать?