|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 659
|
[JS] Funzione "partial application"
Ciao ragazzi. Sto continuando nella lettura del mio libro di Javascript solo che sono arrivato ad una cosa a mio modo di vedere assurda
![]() Dato Codice:
function asArray(quasiArray, start) { var result = []; for (var i = (start || 0); i < quasiArray.length; i++) result.push(quasiArray[i]); return result; } function partial(func) { var fixedArgs = asArray(arguments, 1); return function(){ return func.apply(null, fixedArgs.concat(asArray(arguments))); }; } function map(func, array) { var result = []; forEach(array, function (element) { result.push(func(element)); }); return result; } function forEach(array, action) { for (var i = 0; i < array.length; i++) action(array[i]); } var op = { "+": function(a, b){return a + b;}, "==": function(a, b){return a == b;}, "===": function(a, b){return a === b;}, "!": function(a){return !a;} /* and so on */ } ![]() Ma partial non prevede una singola funzione come argomento. ![]() Grazie ragazzi. EDIT: per testarlo ho usato un comando tipo: Codice:
alert(map(partial(op["=="], 10),[10,2,3]).join(" ")); ![]() ![]() Ultima modifica di legolas93 : 30-12-2011 alle 18:51. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Riguardo la tua prima perplessità, cioè l'argomento di troppo, devi sapere che in Javascript è possibile invocare una funzione con un numero qualsiasi di parametri.
Se sono inferiori a quelli definiti i mancanti risultano undefined e sono paragonabili a parametri con valori di default, con il lato negativo che la cosa deve essere ben prevista e gestita correttamente all'interno della funzione, altrimenti l'esecuzione prosegue tranquillamente fino a che un undefined la fa andare in direzioni indesiderate. Codice:
function test(a, b) { alert(b); } function testDef(a, b) { if( ! b ) b = 0 ; alert(b); } test(1); testDef(1); Codice:
function test() { var somma = 0; for (var i = 0; i < arguments.length; i++) somma += arguments[i]; alert(arguments.length + ': sommatoria -> ' + somma); } test(); test(1,2); test(1,2,10); Tenendo presente queste cose il quadro inizia a comporsi. Resta comunque un Picasso, però si inizia ad apprezzare la follia della cosa... P.S. puoi togliere di mezzo la funzione map, alleggerendo un po' il ragionamento, invocando direttamente il risultato di partial Codice:
alert( partial(op["=="], 10)(10) ) ; alert( partial(op["=="], 10)(9) ) ; Codice:
var op = { "+": function(a, b){return a + b;}, "==": function(a, b){return a == b;}, "===": function(a, b){return a === b;}, "!": function(a){return !a;} /* and so on */ } function (){ var fixedArgs = new Array(1) ; fixedArgs[0] = 10 ; /* partial(op["=="], 10)(9) */ var func = op["=="] ; /* partial(op["=="], 10)(9) */ return func.apply(null, fixedArgs.concat(asArray(arguments))); }(9) /* partial(op["=="], 10)(9) */ //Risultato false
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 659
|
I tuoi esempi gli ho capiti benebene
![]() Ora torniamo a: Codice:
alert(map(partial(op["=="], 10),[10,2,3]).join(" ")); Codice:
map(partial(op["=="], 10),[10,2,3] Se ce la fai seguimi e dimmi se è giusto il ragionamento. Quando io chiamo Codice:
partial(op["=="], 10 ![]() e mi ritorna una funzione di Uguaglianza applicata alla concatenazione tra fixedArgs e arguments. Penso di essere ancora nel giusto, no?. Ma quest'ultimo arguments agli argomenti di quale funzione si riferisce? A quella anonima all'interno di partial? Io sono propenso per la seconda. E come faccio a riempire i parametri della funzione anonima? Con questo: Codice:
result.push(func(element)); //del map ![]() Ultima modifica di legolas93 : 31-12-2011 alle 10:12. |
![]() |
![]() |
![]() |
#4 | ||||
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Quote:
Quote:
Quote:
Quote:
La funzione anonima viene invocata più volte, ogni volta con il successivo elemento dell'array [10,2,3] in forEach.
![]()
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
||||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:14.