functional programming in java script

Click here to load reader

Post on 10-May-2015

1.243 views

Category:

Technology

3 download

Embed Size (px)

TRANSCRIPT

  • 1.Programare funcional n JavascriptAlexandru Badiu

2. ConinutCe este programarea funcional?Funcii de ordin naltFuncii anonimeFuncii imbricatenchideriCurryingProgramare funcional n Javascript - Alexandru Badiu 3. Funcional?Ce este programarea funcional?Programarea funcional este o paradigm deprogramareSe pune accent pe evaluarea expresiilor i nu peexecuia comenzilorExpresiile sunt funciiConstante vs variabileLisp, Erlang, Haskell, OCamlDac ai scris cod Javascript sau Ruby atunciprobabil ai folosit concepte din programareafuncional fr s tiiProgramare funcional n Javascript - Alexandru Badiu 4. Paradigme?Ce este programarea funcional?O paradigm de programare e un stil de a programaConcepte pentru elementele unui program (funcii,variabile, obiecte etc)Concepte pentru paii unui calcul (evaluare,atribuire etc)Un limbaj de programare poate oferi suport pentrumai multe paradigmeProgramare funcional n Javascript - Alexandru Badiu 5. Procedural Ce este programarea funcional? #include #include int main(void) { puts("Hello World!"); return EXIT_SUCCESS; }Programare funcional n Javascript - Alexandru Badiu 6. OOCe este programarea funcional?class HelloWorld {static public void main( String args[] ) {System.out.println( "Hello World!" );}}Programare funcional n Javascript - Alexandru Badiu 7. Logic Ce este programarea funcional? ?- write(Hello World!), nl.Programare funcional n Javascript - Alexandru Badiu 8. FuncionalCe este programarea funcional?(alert Hello World!)Programare funcional n Javascript - Alexandru Badiu 9. Limbaje ezoterice Ce este programarea funcional?HAICAN HAS STDIO?VISIBLE "HAI WORLD!"KTHXBYEProgramare funcional n Javascript - Alexandru Badiu 10. HTMLCe este programarea funcional?

HTML nu este un limbaj de programare.

Programare funcional n Javascript - Alexandru Badiu 11. JavascriptCe este programarea funcional?Programare funcional n Javascript - Alexandru Badiu 12. Definiie Funcii de ordin naltFunciile sunt de ordin naltSunt obiecteAu proprietiPot fi transmise altor funciiPot fi ntoarse ca rezultatPot fi create dinamicProgramare funcional n Javascript - Alexandru Badiu 13. ExempleFuncii de ordin naltfunction say(what) {console.log(what);}var say = function (what) {console.log(what);}say(hello);// hellovar spune = say;spune(salut);// salutsay = function (what) {console.log(nu vreau);}spune(ceva);// cevaProgramare funcional n Javascript - Alexandru Badiu 14. ExempleFuncii de ordin nalt var gen_func = function (op) { switch (op) { case +: return function () { varr = arguments[0]; for (var i=1; i 10; }); // 0 Cauta(v, function (x) { return x < 10; }); // 3Programare funcional n Javascript - Alexandru Badiu 20. Definiie Funcii imbricateFuncii definite n interiorul altor funciiFuncii anonimeFuncii non-anonimeProgramare funcional n Javascript - Alexandru Badiu 21. ExempleFuncii imbricate function imbri(){ var mesaj = "salut"; function imbri2() {console.log(mesaj); }; imbri2(); }; imbri(); // salut function imbri(mesaj){( function () { console.log(mesaj); } ) (mesaj); }; imbri("test"); // testProgramare funcional n Javascript - Alexandru Badiu 22. Definiienchiderin englez: closuresFunciile imbricate au acces la variabilele dinfuncia printeChiar i dup ce execuia funciei printe s-aterminatFuncia = (Funcia imbricat, Variabile locale)Variabilele nu sunt copiate ci este pstrat oreferinProgramare funcional n Javascript - Alexandru Badiu 23. Exemplenchideri Funcia ntoars are acces la variabila msg function say(what) { var msg = "Mesaj: " + what; return function () { console.log(msg); }; } say(unu)(); // Mesaj: unu say(doi)(); // Mesaj: doi function say(what) { var ret = function () { console.log(msg); }; var msg = "Mesaj: " + what; return ret; } say(unu)(); // Mesaj: unu say(doi)(); // Mesaj: doiProgramare funcional n Javascript - Alexandru Badiu 24. Exemple nchideri Acelai lucru este valabil i pentru funcii declanate de evenimente function sendRequest(url,callback,postData) { var req = createXMLHTTPObject(); if (!req) { return; } var method = (postData) ? "POST" : "GET"; req.open(method,url,true); req.setRequestHeader(User-Agent,XMLHTTP/1.0); if (postData) { req.setRequestHeader(Content-type,application/x-www-form-urlencoded); } req.onreadystatechange = function () { if (req.readyState != 4) return; if (req.status != 200 && req.status != 304) { alert(HTTP error+ req.status); return; } callback(req); } if (req.readyState == 4) return; req.send(postData); }Programare funcional n Javascript - Alexandru Badiu 25. Exemplenchideri Mai multe funcii imbricate au acces la aceeai nchiderefunction setup() {var num = 21;afiseaza = function () {console.log(num);}incrementeaza = function () {num++;}}setup();afiseaza();// 21incrementeaza();afiseaza();// 22setup();afiseaza();// 21Programare funcional n Javascript - Alexandru Badiu 26. Gotchasnchideri Ce este afisat? function pregateste_functii(num) { var res = []; for (var i=0; i Z curry(f):X -> (Y -> Z)Non matematic: console.log(aduna(2, 3)); // 5 var aduna4 = aduna(4); console.log(aduna4(10)); // 14Programare funcional n Javascript - Alexandru Badiu 31. ImplementareCurrying Varianta simplfunction aduna(a) {return function (b) { return a + b; };}var aduna4 = aduna(4);var aduna10 = aduna(10);aduna4(5);// 9aduna10(5);// 15 Ideal ar fi s putem aplica procedeul la orice funcie, fr s o modificm function aduna(a, b) { return a + b; } var aduna4 = aduna.curry(4);Programare funcional n Javascript - Alexandru Badiu 32. ImplementareCurryingFunction.prototype.curry = function() {var fn = this, args = []; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); return function() {for (var i = 0; i < arguments.length; i++)args.push(arguments[i]);return fn.apply(window, args); };};function aduna(a, b) {return a + b;}a = aduna.curry(5);b = aduna.curry(10);a(10); // 15b(10); // 20Programare funcional n Javascript - Alexandru Badiu 33. ImplementareCurrying Uneori este util schimbarea scope-ului bind din Prototype, dojo.lang.curryFunction.prototype.curry = function(scope) {var fn = this, args = [];var scope = scope || window; for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); return function() {for (var i = 0; i < arguments.length; i++)args.push(arguments[i]);return fn.apply(scope, args); };};Programare funcional n Javascript - Alexandru Badiu 34. Exemple Currying function sayHello(msg) { console.log(msg + n You clicked on+ this.id); } var el1 = document.getElementById(element1); var el2 = document.getElementById(element2); el1.addEventListener(click, sayHello.curry(el1, Hello), false); el2.addEventListener(click, sayHello.curry(el2, Salut), false); function update(elem, data) { $(elem).html(data); } $.get("foo.php", update.curry(window, elem1)); $.get("bar.php", update.curry(window, elem2)); function update(data) { $(this).html(data); } $.get("foo.php", update.curry($(elem1))); $.get("bar.php", update.curry($(elem2)));Programare funcional n Javascript - Alexandru Badiu 35. Resurse http://www.joelonsoftware.com/items/2006/08/01.html http://osteele.com/archives/2007/07/functional-javascript http://invisibleblocks.wordpress.com/2007/02/23/functional- programming-in-javascript-and-ruby/Programare funcional n Javascript - Alexandru Badiu 36. ? Alexandru Badiu [email protected]://voidberg.org