Citazioni di codice e alberi di espressione

expression-trees f# quotations

Domanda

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.

Risposta accettata

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.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché