Mi chiedo se c'è qualche differenza nel modo in cui le due caratteristiche sono implementate sotto il cofano? Ie non sono solo citazioni di codice costruite in cima ai vecchi alberi di espressione?
Grazie.
I due tipi sono abbastanza simili, ma sono rappresentati in modo diverso.
Le citazioni sono progettate in un modo più funzionale. Ad esempio, foo ab
sarebbe rappresentato come una serie di applicazioni App(App(foo, a), b)
Le quotazioni possono rappresentare alcuni costrutti che sono disponibili solo in F # e che usano gli alberi di espressione per nasconderli. Ad esempio, esiste Expr.LetRecursive
per let rec
dichiarazioni di registrazione
Le citazioni sono state introdotte per la prima volta in .NET 3.0. Allora gli alberi di espressione potevano rappresentare solo espressioni C #, quindi non era possibile catturare facilmente tutti i costrutti F # (le quotazioni possono catturare qualsiasi espressione di F # comprese quelle imperative).
Le citazioni sono anche progettate per essere facilmente processabili usando la ricorsione. Il modulo ExprShape
contiene pattern che ti permettono di gestire tutte le quotazioni possibili con soli 4 casi (che è molto più semplice dell'implementazione del pattern di visitatore con decine di metodi in C #).
Quando hai una citazione F #, puoi tradurla in albero di espressioni C # usando FSharp.Quotations.Evaluator . Questo è molto utile se stai usando alcune API .NET che si aspettano alberi di espressioni da F #. Per quanto ne so, non c'è traduzione al contrario.