2009/4/2 Administrator <gob...@gmail.com>:
Cosa ti fa credere che il costrutto while sarebbe più performante di
una ricorsione?
funzione(A, C) when C < 10 ->
NuovoA = qualcosa(),
{C+1, NuovoA};
funzione(A, C) -> % C >= 10
A.
E' una ricorsione tail: il compilatore non consuma lo stack per
eseguirla. È efficiente quanto un loop, più o meno di una quantità non
misurabile (per ottenere la quale un cambio nel linguaggio non vale la
pena) e che di sicuro verrebbe dominata da qualunque altra operazione
devi effettuare all'interno del while.
La tua soluzione implica avere una funzione nel cui corpo una
variabile cambia valore. Il single assignment è una delle scelte di
design di base di Erlang: non a tutti piace, per cui sono nati
progetti per scrivere nuovi linguaggi da eseguire sulla VM di Erlang
(tipo Reia http://wiki.reia-lang.org/wiki/Reia_Programming_Language).
Ma il single assignment è troppo radicato in erlang per essere
spazzato via dagli ipotetici vantaggi di un costrutto while.
-- Daniele
Infatti il meccanismo di tail recursion permette di effettuare delle
"iterazioni" via ricorsione. Per chi volesse approfondire:
http://www.dmi.unict.it/~barba/LinguaggiII.html/READING_MATERIAL/NotesOntalilcc.htm
> La tua soluzione implica avere una funzione nel cui corpo una
> variabile cambia valore. Il single assignment è una delle scelte di
> design di base di Erlang: non a tutti piace, per cui sono nati
> progetti per scrivere nuovi linguaggi da eseguire sulla VM di Erlang
> (tipo Reia http://wiki.reia-lang.org/wiki/Reia_Programming_Language).
> Ma il single assignment è troppo radicato in erlang per essere
> spazzato via dagli ipotetici vantaggi di un costrutto while.
Eliminare il single assignment vuol dire - di fatto - stravolgere la
natura funzionale del linguaggio.
Come molti gia' sapranno, i linguaggi funzionali si basano sul modello
computazionale del lambda-calcolo dove la "variabile" non e' - come nei
linguaggi imperativi - una sorta di "cella di memoria" da cui leggere e
da modificare a piacimento. La variabile del lambda-calcolo e' un
concetto molto vicino a quello di "variabile matematica": e' la
rappresentazione astratta di una certa entita' concreta; non avrebbe
senso poterla modificare dato che - essendo astratta - di fatto non esiste!
Loris
--
"let me take you down, 'cos i'm going to Strawberry Fields."
-----------------------------------------------------------------
[ Loris Fichera a.k.a. kidA --- HOME http://www.kida.netsons.org ]
[ ICQ UIN: 118833284 skype loris_fichera ]
[ JABBER loris[dot]fichera[at]gmail[dot]com//GPG key ID 179FC4DD ]
[ Fingerprint D546 D632 3057 CCBB DF63 A8EC 6858 7300 179F C4DD ]
Ti hanno gia' risposto in tanti. Non credo che ci sia nulla di piu'
performante, in un linguaggio funzionale, di una tail-recursion. Quello
che vuoi fare col while si puo' fare in erlang con una tail-recursion e un
costrutto case, ad esempio. Non ha senso avere un altro costrutto per fare
la stessa cosa che puoi fare gia' con un costrutto esistente (e che e'
gia' molto molto performante).
HND
KatolaZ