kann ich einen Zitat Ausdruck Parameter definieren, so dass nicht nur der resultierende Typ des Ausdrucks ist kompiliert Zeit sondern auch die Call-Site-Ausdruck.Check Code Quotation Struktur während der Kompilierung
lässt ein Beispiel sehen:
type A = {
a : int
}
type Checker() =
static member Check(e : Expr<int>) : ResultType = ...
Die folgenden offensichtlich
let a = { a = 1 }
Checker.Check <@ a.a @>
Resultierende in einem tatsächlichen Ausdruck ähnlich PropertyGet(..., PropertyGet (....), a)
der Eingabe überprüfen.
Und nun eine andere Art und Weise
let getInt (a:A) : int = a.a
Nachfolgend stellt auch
Checker.Check <@ getInt a @>
Doch wie kann ich verhindern, dass zweites Beispiel kompiliert und nur für PropertyGet
s erlauben? (nur als ein Beispiel).
Ich weiß, ich kann die Struktur des Ausdrucks zur Laufzeit überprüfen - aber ich möchte eine Kompilierzeit überprüfen.
Sie können nicht. Wenn dies eine kritische Anforderung ist, schlage ich vor, anstelle von Zitaten eine Bibliothek von Kombinatoren zu verwenden. –
Wie würde das helfen? – robkuz
Sie können bewirken, dass Ihre Kombinatoren (oder besser gesagt, der Datentyp, den sie erzeugen) keine ungültigen Daten erstellen können. Sie wissen, "machen ungültige Daten nicht darstellbar" und all das. –