While

3 views
Skip to first unread message

Administrator

unread,
Apr 2, 2009, 9:19:07 AM4/2/09
to Erlang Etna User Group
Ciao,
so che erlang ha una filosofia strettamente funzionale.
Mi sono chiesto però perchè non implementare costrutti di livello più
basso per migliorare un tantino le performance.
Ho pensato al costrutto WHILE e alla sintassi che poi non stonerebbe
tanto:

funzione(Argomento,Contatore) -> %definizione di una normale funzione
while %inizializzazione del costrutto a MATCH
Contatore < 10 -> %MATCH identificato ed esecuzione del blocco
...
ConatatoreNuovo = Contatore + 1, %counter incrase
{ArgomentoModificato,Contatore Nuovo}; %la tupple di return che
verrà passta di nuovo a WHILE, notiamo la fine del MATCH con il ;
Contatore == 10 ->
fine
end.

Roberto

unread,
Apr 2, 2009, 9:31:50 AM4/2/09
to erlan...@googlegroups.com
Il modulo lists contiene un'infinita' di funzioni che puoi usare
proprio per questo.
Prova a dare un'occhiata a foldl, any o map. Il tuo "Contatore" e'
proprio l'accumulatore che viene utilizzato all'interno di quelle
funzioni.
Saluti,
Roberto Aloi

2009/4/2 Administrator <gob...@gmail.com>:

freddi301 ji

unread,
Apr 2, 2009, 9:33:49 AM4/2/09
to erlan...@googlegroups.com
ciao,
io non mi riferivo alla funzionalità, ma lla possibilità di poter
scrivere porzioni di codice più performanti.

Daniele Varrazzo

unread,
Apr 3, 2009, 6:06:26 AM4/3/09
to erlan...@googlegroups.com
2009/4/2 freddi301 ji <gob...@gmail.com>:

>
> ciao,
> io non mi riferivo alla funzionalità, ma lla possibilità di poter
> scrivere porzioni di codice più performanti.
>

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

kidA

unread,
Apr 3, 2009, 7:12:00 AM4/3/09
to erlan...@googlegroups.com
Daniele Varrazzo wrote:
> E' una ricorsione tail: il compilatore non consuma lo stack per
> eseguirla. È efficiente quanto un loop

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 ]

Vincenzo Nicosia

unread,
Apr 14, 2009, 9:38:23 AM4/14/09
to erlan...@googlegroups.com

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

Reply all
Reply to author
Forward
0 new messages