人間が読めるのF#の引用のための任意の組み込み関数はありますか?

StackOverflow https://stackoverflow.com/questions/1448961

  •  11-09-2019
  •  | 
  •  

質問

引用する場合

<@ 1 + 1 @>

私が欲しい "1 + 1"

の代わりに

"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"

正しい解決策はありません

他のヒント

あなたはそれを自分で記述する必要があります。 のコード引用抽象構文木を変換するためのガイドとしてF#の引用ビジュアライザを参照してください。

私は大きなオープンソースプロジェクトの一部として引用逆コンパイラを実装している 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のもう一つは、計算式ですが、私は、あなたが最初にそれらをスキップすることができると思います。

そして、あなたが解決する必要がありますあいまいさのウサギの穴があり、配管作業のような規則は、新しい行を開始し、開始は新しい行、インデント、中置、接頭辞、(のような特殊なケースましょう::)オペレータなど。

すべてのすべてで、なんとか、しかし、簡単ではありません。以下のような逆コンパイルの並び替えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top