Я пишу расширение 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, который выполняет альфа-переименование, чтобы дать уникальные идентификаторы каждому именованному значению. Однако это может усложнить отладку, так как создаст новые идентификаторы, которые не появляются в исходном исходном коде.
- либо где-то есть контекст, который отслеживает текущую область действия: например, преобразователь, который каждый раз новое имя добавляется в среду, присваивает ему уникальный идентификатор. Тогда пользователю придется сравнивать идентификаторы, а не только имена.
Так что мой вопрос состоит из трех частей:
- Есть ли такой инструмент / библиотека / функция?
- Если нет, возможно ли / полезно ли это иметь?
- Если да, каков наилучший способ сделать это?