人間が読めるのF#の引用のための任意の組み込み関数はありますか?
-
11-09-2019 - |
質問
引用する場合
<@ 1 + 1 @>
私が欲しい "1 + 1"
の代わりに
"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32),
[Value (1), Value (1)])"
正しい解決策はありません
他のヒント
私は大きなオープンソースプロジェクトの一部として引用逆コンパイラを実装している UNQUOTE に。それは多くの単純なF#は単線非光構文文字列(デコンパイラの機能のリストについては、プロジェクトのホームページを参照)などの表現を引用逆コンパイルすることができます。たとえば、
> decompile <@ (11 + 3) / 2 = String.length ("hello world".Substring(4, 5)) @>;;
val it : string =
"(11 + 3) / 2 = String.length ("hello world".Substring(4, 5))"
@Kurt Schelfthoutは逆コンパイルのF#名言人間が読める形式に直面する多くの課題に関する正しいです。しかし、私の仕事からこれまでのところ、私はがの正しいのF#コードを生成することができます引用逆コンパイラを書くために、のことが可能であることを信じています。例えば一致表現と計算式を取り、UNQUOTE逆コンパイラはは次の簡単な例では、正しいF#コードを生成することができます:
> decompile <@ match true with | true -> "hi" | _ -> "bye" @>;;
val it : string =
"let matchValue = true in if matchValue then "hi" else "bye""
> decompile <@ seq {yield 1; yield 2} @>;;
val it : string =
"seq (Seq.delay (fun unitVar -> Seq.append (Seq.singleton 1) (Seq.delay (fun unitVar -> Seq.singleton 2))))"
(それほど難しいことではありませんが、私は思う)中置とプレフィックス演算子は(あなたが最初の例で見ることができるように)あまりにもハードではなく、ソースなどの新しいラインのような構造とインデントは、興味深いトピックです。しかし、シングルライン非光構文はUNQUOTEの要件のために十分である。
何もありませんが、それは非常に単純な場合を除いて、それほど簡単ではありません。主な問題の一つは、例えば、試合構築物です。これは、もし、スイッチ文の全体の束のためのシンタックスシュガー(あなたが参照してくださいよ、にマッチして引用を印刷してみてください)です。これらbiggiesのもう一つは、計算式ですが、私は、あなたが最初にそれらをスキップすることができると思います。
そして、あなたが解決する必要がありますあいまいさのウサギの穴があり、配管作業のような規則は、新しい行を開始し、開始は新しい行、インデント、中置、接頭辞、(のような特殊なケースましょう::)オペレータなど。
すべてのすべてで、なんとか、しかし、簡単ではありません。以下のような逆コンパイルの並び替えます。