私の質問:冗長な括弧を使用せずに式をきれいに出力する最もクリーンな方法は何ですか?
ラムダ式の次の表現があります。
Term ::= Fun(String x, Term t)
| App(Term t1, Term t2)
| Var(String x)
慣例によりApp
、 は左結合です。つまり、a b c
と解釈され(a b) c
、関数本体は可能な限り右に伸びます。つまり、λ x. x y
と解釈されλ x. (x y)
ます。
私は良い仕事をするパーサーを持っていますが、今はきれいなプリンターが欲しいです。これが私が現在持っているものです(疑似scala):
term match {
case Fun(v, t) => "(λ %s.%s)".format(v, prettyPrint(t))
case App(s, t) => "(%s %s)".format(prettyPrint(s), prettyPrint(t))
case Var(v) => v
}
上記のプリンターは、常に(
)
式を配置します (アトミック変数を除く)。したがって、Fun(x, App(Fun(y, x), y))
それは生成します
(λ x.((λ y.x) y))
私はを頂きたい
λ x.(λ y.x) y