2009-09-19 15 views

risposta

6

Dovrete scrivere voi stessi. Vedere il codice F# quotations visualizer come guida per la trasformazione delle citazioni abstract syntax tree.

0

Non ce n'è, e non è proprio così facile, tranne che in casi molto semplici. Uno dei problemi principali, ad esempio, è il costrutto della partita. È zucchero sintattico per un sacco di istruzioni if ​​e switch (prova a stampare un preventivo con una corrispondenza, vedrai). Un altro di quei biggies sono le espressioni di calcolo, ma immagino che potresti saltare quelli all'inizio.

Quindi c'è una lacuna di ambiguità che dovrai risolvere, con convenzioni come l'operatore di pipe che inizia una nuova riga, lascia che inizi una nuova riga, indentazione, infisso, prefisso, casi speciali come il (::) operatore e così via.

Tutto sommato, fattibile, ma non banale. Un po 'come decompilare.

5

Ho implementato un decompilatore di quotazione come parte di un più ampio progetto open source Unquote. Può decompilare molte semplici espressioni citate in F # come stringhe di sintassi non a riga singola (vedere la home page del progetto per un elenco delle caratteristiche del decompilatore). Ad 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 affrontate quando decompilazione F # Citazioni in forma leggibile. Ma dal mio lavoro finora, credo che sia è possibile scrivere un decompilatore di quotazione che può generare corretto codice F #. Prendere espressioni di corrispondenza e le espressioni di calcolo, ad esempio, il decompilatore Unquote 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))))" 

Infix e prefisso gli operatori non sono troppo difficili (come si può vedere nel primo esempio) , ma la struttura della sorgente come le nuove linee e il rientro è un argomento interessante (anche se non terribilmente difficile, penso). Tuttavia, la sintassi non-light a riga singola è sufficiente per i requisiti di Unquote.

Problemi correlati