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

Итак, мой вопрос состоит из трех частей:

  • Есть ли такой инструмент / библиотека / функция?
  • Если нет, возможно ли / полезно ли это иметь?
  • Если да, то как лучше всего это сделать?

0 ответов

Другие вопросы по тегам