Domanda

Da .NET ha il tailcall OPCODE, Questo può essere usato per determinare se una funzione F # è veramente corsi giudiziario?

Se è vero, qualcuno ha fatto un componente aggiuntivo VS che identifica le funzioni della coda e non-coda?

È stato utile?

Soluzione

Vedi Questo post post sul blog di squadra F # per un riassunto di come F # Compili chiamate di coda.

In breve,

    .
  1. Le chiamate di coda di ritorno diretta vengono in genere convertite in loop.
  2. Recupero reciproco e le chiamate di coda non ricorsive indirette vengono in genere trasformate in chiamate di coda .NET.
  3. Ma vedi il post completo per tutti i dettagli Gory.

Altri suggerimenti

Sì, se il compilatore emette l'istruzione di chiamata tail, quella chiamata sarà ricorsiva alla coda (a partire da CLR 4, ma ci sono ancora alcune eccezioni, dove non sarà effettivamente ricorsivo).Ma ciò non significa necessariamente che l'intera funzione sia ricorsiva alla coda.Ad esempio, posso immaginare la funzione Quicksort compilata in modo che la prima chiamata ricorsiva non sia ricorsiva alla coda e il secondo è.

Inoltre, solo perché qualche funzione non contiene l'istruzione tail, non significa necessariamente che non sia ricorsivo alla coda.Il compilatore JIT può riconoscere una chiamata di coda anche senza l'istruzione tail e ottimizzarla come tale.

Inoltre, il compilatore F # a volte compila funzioni ricorsive in modo non ricorsivo.Questo è un po 'diverso dall'ottimizzazione della chiamata di coda normale e non viene utilizzata l'istruzione tail, ma l'effetto complessivo è simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top