kmyk-jikka / Jikka

an automated solver for problems of competitive programming
https://kmyk-jikka.github.io/Jikka/playground
Apache License 2.0
152 stars 11 forks source link

refactor: Use (string, int) for names instead of just a string #232

Closed kmyk closed 2 years ago

kmyk commented 2 years ago

説明

たとえば以下のようなコードがあったとする。

def f(n: int) -> int:
     n = n + 1
     n = n + 1
     n = n + 1
     return n * n

これは変数名が衝突していて面倒なので、内部的には

def f(n: int) -> int:
     n$2 = n + 1
     n$3 = n$2 + 1
     n$4 = n$3 + 1
     return n$4 * n$4

みたいに変数名を付け替えています。 このときに変数名全体をひとつの文字列として "n$3" みたいにして保持しています。 すると変数名をさらに付け替えるときに "n$3" から "n" を切り出して別の数字を付けて "n$5" にして…となにかと面倒です。そこで ("n", 3) というタプルで持つようにすると実装がきれいになります。

参考: https://hackage.haskell.org/package/template-haskell-2.17.0.0/docs/Language-Haskell-TH-Syntax.html#t:Name