Есть ли PPX маппер, который реализует альфа-переименование? - PullRequest
0 голосов
/ 20 апреля 2020

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

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

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