+
1
|
list
|
skin
|
login
|
editor
α-wwwiki
::
map_reduce
user:none
(3341 bytes)
_h1 serie, map & reduce _p Using the "define" lambdatalk operator to build the functions "serie", "map" and "reduce". {pre 1) define and call the function square : °°{define square (x) return x*x }°° -> {define square (x) return x*x } °°{square 12}°° -> {square 12} 2) define and call the function serie °°{define serie (n) for (var str='', i=0; i< n; i++) str += i + ' '; return str; }°° -> {define serie (n) for (var str='', i=0; i< n; i++) str += i + ' '; return str; } °°{serie 11}°° -> {serie 11} 3) define and call the function map applying square to the previous serie °°{define map (func) for (var str='', i=1; i< arguments.length; i++) str += '{'+func+' '+arguments[i]+'}' + ' '; return str; }°° -> {define map (func) for (var str='', i=1; i< arguments.length; i++) str += '{'+func+' '+arguments[i]+'}' + ' '; return str; } °°{map square {serie 11}}°° -> {map square {serie 11}} 4) define and call the function reduce applying '+' to the previous serie °°{define reduce (func) var args = [].slice.call(arguments).slice(1).join(' '); return '{'+func+' '+args+'}'; }°° -> {define reduce (func) var args = [].slice.call(arguments).slice(1).join(' '); return '{'+func+' '+args+'}'; } °°{reduce + {map square {serie 11}}}°° -> {reduce + {map square {serie 11}}} } _p {b Note} : The functions "serie" and "map" are soon defined in the built-in dictionary : {pre °° xhtml['serie'] = function () { // {serie start end} var args = rest.split( / /g ); var start = args[0]; var end = args[1]; for (var i=start, str=''; i<=end; i++) str += i + ' '; str = str.replace( / $/, '' ); return str; }; xhtml['map'] = function () { // {map func serie} var serie = rest.split( / /g ); var func = serie.shift(); for (var i=0, str=''; i< serie.length; i++) { str += '{' + func + ' ' + serie[i] + '} '; } return str; }; °°} _p It is obvious that the code are similar, except the way the arguments are handled. Built-in or inline defined functions is a question of choice. _h3 computing e = {{lambda () return Math.E}} {pre °°{define expK (n) function fac(n) { return (n< 1)? 1 : n*fac(n-1) } return 1/fac(n) }°° -> {define expK (n) function fac(n) { return (n< 1)? 1 : n*fac(n-1) } return 1/fac(n) } °°{reduce + {map expK {serie 1}}}°° -> {reduce + {map expK {serie 1}}} °°{reduce + {map expK {serie 2}}}°° -> {reduce + {map expK {serie 2}}} °°{reduce + {map expK {serie 3}}}°° -> {reduce + {map expK {serie 3}}} °°{reduce + {map expK {serie 4}}}°° -> {reduce + {map expK {serie 4}}} °°{reduce + {map expK {serie 5}}}°° -> {reduce + {map expK {serie 5}}} °°{reduce + {map expK {serie 6}}}°° -> {reduce + {map expK {serie 6}}} °°{reduce + {map expK {serie 7}}}°° -> {reduce + {map expK {serie 7}}} °°{reduce + {map expK {serie 8}}}°° -> {reduce + {map expK {serie 8}}} °°{reduce + {map expK {serie 9}}}°° -> {reduce + {map expK {serie 9}}} °°{reduce + {map expK {serie 10}}}°° -> {reduce + {map expK {serie 10}}} ... °°{reduce + {map expK {serie 18}}}°° -> {reduce + {map expK {serie 18}}} ... to be compared to the javascript Math value of E } _h3 links _ul http://jsmapreduce.com/