Frage

Bei Zitaten

<@ 1 + 1 @>

ich will "1 + 1"

statt

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

Keine korrekte Lösung

Andere Tipps

Sie müssen es selbst schreiben. Sehen Sie sich die F # Zitate Visualizer Code als Leitfaden für die Transformation der Zitate abstrakte Syntaxbaum.

ich ein Zitat Decompiler als Teil eines größeren Open-Source-Projekt umgesetzt haben Unquote . Es kann viele einfache F # zitierte decompile Ausdrücke als einzeilige Nicht-Licht-Syntax Strings (siehe die Homepage des Projekts für eine Liste von Decompiler Funktionen). Zum Beispiel:

> 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 korrekt über die vielen Herausforderungen konfrontiert, wenn decompiling F # Zitate in für Menschen lesbaren Form. Aber aus meiner Arbeit so weit, wie ich glaube, dass es ist möglich ein Angebot Decompiler zu schreiben, die generieren richtig F # -Code. Nimm Spiel Ausdrücke und Rechenausdrücke zum Beispiel der Unquote Decompiler kann produziert korrekten F # Code in den folgenden einfachen Fällen:

> 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 und Präfix-Operatoren sind nicht zu hart (wie Sie im ersten Beispiel sehen können), aber Quellstruktur wie neue Linien und Vertiefung ist ein interessantes Thema (wenn auch nicht sehr schwierig, glaube ich). Allerdings einzeilige Nicht-Licht-Syntax ist ausreichend für Unquote Anforderungen.

Es gibt keine, und es ist nicht ganz so einfach, außer in sehr einfachen Fällen. Eines der Hauptprobleme, zum Beispiel, ist das Spiel Konstrukt. Es ist syntaktischer Zucker für eine ganze Reihe von if und switch-Anweisungen (versuchen Sie den Druck ein Angebot mit einem Spiel in, Sie werden sehen). Ein weiterer dieser biggies sind Rechenausdrücke, aber ich denke, man diejenigen zunächst überspringen könnte.

Dann gibt es eine den Kaninchenbau von Mehrdeutigkeiten werden müssen Sie, mit Konventionen wie das Rohr Bediener startet eine neue Zeile zu beheben, läßt Sie beginnt einen neuen Linie, Einzüge, Infix, Präfix, Sonderfälle wie die (: :) Betreiber und so weiter.

Alles in allem machbar, aber nicht trivial. Art wie decompiling.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top