<@ 1 + 1 @>
を引用すると、私はあなたがそれを自分で記述する必要があります
代わりの
"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"
<@ 1 + 1 @>
を引用すると、私はあなたがそれを自分で記述する必要があります
代わりの
"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"
"+ 1" をしたいです。引用文の抽象構文ツリーを変換するためのガイドとして、F# quotations visualizerコードを参照してください。
非常に簡単な場合を除いて、それはありません。それほど簡単ではありません。たとえば、主な問題の1つは、マッチコンストラクトです。 if文とswitch文の全部の文法的な砂糖です(引用符をつけて印刷してみてください)。それらの大きなもののもう一つは計算式ですが、最初はそれらをスキップすることができます。
パイプオペレータのような慣習で解決しなければならない曖昧さのウサギの穴があります。新しいラインを開始し、新しいライン、インデント、インフィックス、プレフィックス、 )演算子などがあります。
すべてで、実行可能ですが、自明ではありません。逆コンパイルのような並べ替え。
私は大きなオープンソースプロジェクト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#コードを生成できる引用逆コンパイラを書くことが可能ですと考えています。例えば一致表現と計算式を取り、次の簡単な例では、正しいF#コードを生成することができますUNQUOTE逆コンパイラ:(あなたが最初の例で見ることができるように)
> 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の要件には、シングルラインの非ライト構文で十分です。