Domanda

Quando citando

<@ 1 + 1 @>

Voglio "1 + 1"

invece di

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

Nessuna soluzione corretta

Altri suggerimenti

Dovrete scrivere voi stessi.Vedere la F# citazioni visualizer codice come una guida per trasformare le quotazioni albero di sintassi astratta.

Ho implementato un preventivo decompiler come parte di un più grande progetto open source Unquote.È possibile decompilare molti semplici F# citato espressioni come singola linea di non-luce sintassi delle stringhe (vedi home page del progetto per un elenco di decompiler caratteristiche).Per esempio,

> 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 è corretta circa le molte sfide da affrontare in decompilazione F# Citazioni in forma leggibile per l'uomo.Ma dal mio lavoro, credo che è possibile scrivere una citazione decompiler che può generare corretto F# codice.Prendere espressioni di corrispondenza e di calcolo di espressioni per esempio, il Unquote decompiler può produrre corretto codice F#, nei seguenti casi semplici:

> 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))))"

Infisso e il prefisso operatori non sono troppo difficili (come potete vedere nel primo esempio), ma la struttura di origine come nuove linee e il rientro è un argomento interessante (anche se non è terribilmente difficile, credo).Tuttavia, singola linea di non-luce sintassi è sufficiente per Unquote le esigenze.

Non c'è nessuno, e non è molto facile, tranne in casi molto semplici.Uno dei problemi principali, per esempio, è la partita di costruire.È " zucchero sintattico per tutta una serie di se e di istruzioni switch (provare a stampare un preventivo di una partita, si vedrà).Un'altra di quelle cose più importanti sono il calcolo di espressioni, ma credo che si potrebbe saltare quelle in un primo momento.

Poi c'è un buco di coniglio di ambiguità dovrete risolvere, con convenzioni come l'operatore pipe inizia una nuova riga, lasciate che inizia una nuova riga, il rientro, infisso, prefisso, in casi particolari come (::) operatore e così via.

Tutto fattibile, ma non banale.Un po ' come la decompilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top