Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) {...
-
Upload
lesly-siddens -
Category
Documents
-
view
231 -
download
1
Transcript of Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) {...
![Page 1: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/1.jpg)
Save this in an .html file.
<html><body><pre><script>function log(arg) { document.writeln(arg);}function identity(x) { return x;}log(identity(3));</script></pre></body></html>
![Page 2: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/2.jpg)
Fun With Functions
Douglas Crockford
![Page 3: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/3.jpg)
Write an identity function that takes an
argument and returns that argument.
identity(3) // 3
![Page 4: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/4.jpg)
function identity(x) { return x;}
var identity = function identity(x) { return x;};
![Page 5: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/5.jpg)
<html><body><pre><script>function log(arg) { document.writeln(arg);}function identity(x) { return x;}log(identity(3));</script></pre></body></html>
![Page 6: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/6.jpg)
Three Rules
1. If you have a question, you must ask it.
2. If you need more time, you must say so.
3. I won’t debug your stuff.
![Page 7: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/7.jpg)
Quiz
![Page 8: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/8.jpg)
What is x?
function funky(o) {
o = null;
}
var x = [];
funky(x);
log(x);
A.nullB.[]C.undefinedD.throw
![Page 9: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/9.jpg)
What is x?
function funky(o) {
o = null;
}
var x = [];
funky(x);
log(x);
A.nullB.[]C.undefinedD.throw
![Page 10: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/10.jpg)
function funky(o) {
o = null;
}
var x = [];
funky(x);
log(x);x
global
[ ]
![Page 11: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/11.jpg)
function funky(o) {
o = null;
}
var x = [];
funky(x);
log(x);x
global
[ ]
o
funky
![Page 12: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/12.jpg)
function funky(o) {
o = null;
}
var x = [];
funky(x);
log(x);x
global
[ ]
o
funky
![Page 13: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/13.jpg)
What is x?
function swap(a, b) { var temp = a; a = b; b = temp;}var x = 1, y = 2;swap(x, y);log(x);
A.1B.2C.undefinedD.throw
![Page 14: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/14.jpg)
What is x?
function swap(a, b) { var temp = a; a = b; b = temp;}var x = 1, y = 2;swap(x, y);log(x);
A.1B.2C.undefinedD.throw
![Page 15: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/15.jpg)
function swap(a, b) { var temp = a; a = b; b = temp;}var x = 1, y = 2;swap(x, y);log(x);
xy
global
12
![Page 16: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/16.jpg)
function swap(a, b) { var temp = a; a = b; b = temp;}var x = 1, y = 2;swap(x, y);log(x);
xy
global
12
abtemp
swap
![Page 17: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/17.jpg)
function swap(a, b) { var temp = a; a = b; b = temp;}var x = 1, y = 2;swap(x, y);log(x);
xy
global
12
abtemp
swap
![Page 18: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/18.jpg)
Write three binary functions, add , sub, and
mul, that take two numbers and return their
sum, difference, and product.
add(3, 4) // 7
sub(3, 4) // -1
mul(3, 4) // 12
![Page 19: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/19.jpg)
function add(first, second) { return first + second;}
function sub(first, second) { return first - second;}
function mul(first, second) { return first * second;}
![Page 20: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/20.jpg)
Write a function identityf that takes an argument and returns a
function that returns that argument.
var three = identityf(3);
three() // 3
![Page 21: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/21.jpg)
function identityf(x) {
return function () {
return x;
};
}
![Page 22: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/22.jpg)
Write a function addf that adds from two invocations.
addf(3)(4) // 7
![Page 23: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/23.jpg)
function addf(first) { return function (second) { return first + second; };}
![Page 24: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/24.jpg)
Write a function liftf that takes a binary
function, and makes it callable with two
invocations.
var addf = liftf(add);addf(3)(4) // 7liftf(mul)(5)(6) // 30
![Page 25: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/25.jpg)
function liftf(binary) { return function (first) { return function (second) { return binary(first, second); }; };}
![Page 26: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/26.jpg)
Write a function curry that takes a function and an argument, and returns a function that can take a
second argument.
var add3 = curry(add, 3);add3(4) // 7
curry(mul, 5)(6) // 30
![Page 27: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/27.jpg)
function curry(binary, first) { return function (second) { return binary(first, second); };}
function curry(func, first) { return liftf(func)(first);}
currying
schönfinkelisation
![Page 28: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/28.jpg)
function curry(binary, first) { return function (second) { return binary(first, second); };}
function curry(binary, first) { return liftf(binary)(first);}
![Page 29: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/29.jpg)
function curry(binary, first) { return function (second) { return binary(first, second); };}
function curry(func, first) { return liftf(func)(first);}
currying
schönfinkelisation
![Page 30: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/30.jpg)
function curry(func) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function () { return func.apply( null, args.concat(slice.call(arguments, 0)) ); };}
function curry(func, ...first) { return function (...second) { return func(...first, ...second); };}
![Page 31: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/31.jpg)
function curry(func) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function () { return func.apply( null, args.concat(slice.call(arguments, 0)) ); };}
function curry(func, ...first) { return function (...second) { return func(...first, ...second); };}
![Page 32: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/32.jpg)
Without writing any new functions, show three
ways to create the inc function.
inc(5) // 6inc(inc(5)) // 7
![Page 33: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/33.jpg)
1. inc = addf(1);
2. inc = liftf(add)(1);
3. inc = curry(add, 1);
![Page 34: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/34.jpg)
Write a function twice that takes a binary
function and returns a unary function that passes its argument to the binary
function twice.
add(11, 11) // 22var doubl = twice(add);doubl(11) // 22var square = twice(mul);square(11) // 121
![Page 35: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/35.jpg)
function twice(binary) { return function (a) { return binary(a, a); };}
![Page 36: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/36.jpg)
Write reverse, a function that reverses the
arguments of a binary function.
var bus = reverse(sub);bus(3, 2) // -1
![Page 37: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/37.jpg)
function reverse(binary) { return function (first, second) { return binary(second, first); };}
function reverse(func) { return function (...args) { return func(...args.reverse()); };}
![Page 38: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/38.jpg)
Write a function composeu that takes two unary
functions and returns a unary function that calls
them both.
composeu(doubl, square)(5) // 100
![Page 39: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/39.jpg)
function composeu(f, g) { return function (a) { return g(f(a)); };}
![Page 40: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/40.jpg)
Write a function composeb that takes two binary
functions and returns a function that calls them
both.
composeb(add, mul)(2, 3, 7) // 35
![Page 41: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/41.jpg)
function composeb(f, g) { return function (a, b, c) { return g(f(a, b), c); };}
![Page 42: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/42.jpg)
Write a once function that allows a binary function to
be called only once.
var add_once = once(add);add_once(3, 4) // 7add_once(3, 5) // undefined
![Page 43: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/43.jpg)
function once(binary) { var flag = true; return function (a, b) { if (flag) { flag = false; return binary(a, b); } return undefined; };}
![Page 44: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/44.jpg)
function once(any) { var flag = true; return function (...all) { if (flag) { flag = false; return any(...all); } return undefined; };}
![Page 45: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/45.jpg)
Write a fromTo function that produces a generator that will produce values in
a range.
var index = fromTo(0, 3);index() // 0index() // 1index() // 2index() // undefined
![Page 46: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/46.jpg)
function fromTo(from, to) { return function () { var value = from; if (value < to) { from += 1; return value; } return undefined; };}
![Page 47: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/47.jpg)
Write an element function that takes an array and an optional
generator (like the result of fromTo) and produces a
generator that will produce the elements of the array.
var ele = element([ 'a', 'b', 'c', 'd'], fromTo(1, 3));ele() // 'b'ele() // 'c'ele() // undefined
![Page 48: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/48.jpg)
function element(array, gen) { if (gen === undefined) { gen = fromTo( 0, array.length ); } return function () { var index = gen(); if (index !== undefined) { return array[index]; } };}
![Page 49: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/49.jpg)
Write a collect function that takes a generator and an array
and produces a function that will collect the results in the array.
var array = [], col = collect(fromTo(5, 7), array);col() // 5col() // 6col() // undefinedarray // [5, 6]
![Page 50: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/50.jpg)
function collect(gen, array) { return function () { var value = gen(); if (value !== undefined) { array.push(value); } return value; };}
![Page 51: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/51.jpg)
Write a filter function that takes a generator and a predicate and
produces a generator that produces only the values
approved by the predicate.
var fil = filter(fromTo(0, 5), function third(value) { return (value % 3) === 0; });fil() // 0fil() // 3fil() // undefined
![Page 52: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/52.jpg)
function filter(gen, predicate) { return function () { var value; do { value = gen(); } while ( value !== undefined && !predicate(value) ); return value; };}
![Page 53: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/53.jpg)
function filter(gen, predicate) { return function recur() { var value = gen(); if ( value === undefined || predicate(value) ) { return value; } return recur(); };}
![Page 54: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/54.jpg)
Write a concat function that takes two generators and produces a generator that combines the sequences.
var con = concat(fromTo(0, 3), fromTo(0,2));con() // 0con() // 1con() // 2con() // 0con() // 1con() // undefined
![Page 55: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/55.jpg)
function concat(gen1, gen2) { return function () { var value; if (gen1 !== undefined) { value = gen1(); if (value !== undefined) { return value; } gen1 = undefined; } return gen2(); };}
![Page 56: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/56.jpg)
Write a repeat function that takes a generator and calls it
until it returns undefined.
var array = [];repeat(collect(fromTo(0, 4), array));log(array); // 0, 1, 2, 3
![Page 57: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/57.jpg)
function repeat(gen) { var value; do { value = gen(); } while (value !== undefined);}
function repeat(func) { if (func() !== undefined) { return repeat(func); }}
![Page 58: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/58.jpg)
function repeat(gen) { var value; do { value = gen(); } while (value !== undefined);}
function repeat(gen) { if (gen() !== undefined) { return repeat(gen); }}
![Page 59: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/59.jpg)
Write a map function that takes an array and a unary function, and returns an array containing
the result of passing each element to the unary function.
Use the repeat function.
map([2, 1, 0], inc) // [3, 2, 1]
![Page 60: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/60.jpg)
function map(array, unary) { var ele = element(array), result = []; repeat(collect(function () { var value = ele(); if (value !== undefined) { return unary(value); } }, result)); return result;}
![Page 61: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/61.jpg)
Write a reduce function that takes an array and a binary
function, and returns a single value.
Use the repeat function.
reduce([], add) // undefinedreduce([2], add) // 2reduce([2, 1, 0], add) // 3
![Page 62: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/62.jpg)
function reduce(array, binary) { var ele = element(array), result; repeat(function () { var value = ele(); if (value !== undefined) { result = result === undefined ? value : binary(result, value); } return value; }); return result;}
![Page 63: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/63.jpg)
Write a counter function that returns an object containing two
functions that implement an up/down counter, hiding the
counter.
var object = counter(10), next = object.next, prev = object.prev;next() // 11prev() // 10prev() // 9next() // 10
![Page 64: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/64.jpg)
function counter(value) { return { next: function () { value += 1; return value; }, prev: function () { value -= 1; return value; } };}
![Page 65: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/65.jpg)
Make a revocable function that takes a unary function, and
returns an object containing an invoke function that can invoke
the unary function, and a revoke function that disables
the invoke function.
var rev = revocable(identity), invoke = rev.invoke;invoke(7); // 7rev.revoke();invoke(8); // undefined
![Page 66: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/66.jpg)
function revocable(unary) { return { invoke: function (arg) { if (unary !== undefined) { return unary(arg); } }, revoke: function () { unary = undefined; } };}
![Page 67: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/67.jpg)
Make a function gensymf that makes a function that
generates unique symbols.var geng = gensymf("G"),
genh = gensymf("H"); geng() // "G1"genh() // "H1"geng() // "G2"genh() // "H2"
![Page 68: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/68.jpg)
function gensymf(prefix) { var number = 0; return function () { number += 1; return prefix + number; };}
![Page 69: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/69.jpg)
Write a function gensymff that takes a unary
function and a seed and returns a gensymf.
var gensymf = gensymff(inc, 0), geng = gensymf("G"), genh = gensymf("H"); geng() // "G1"genh() // "H1"geng() // "G2"genh() // "H2"
![Page 70: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/70.jpg)
function gensymff(unary, seed) { return function (prefix) { var number = seed; return function () { number = unary(number); return prefix + number; }; };}
![Page 71: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/71.jpg)
Make a function fibonaccif that returns a generator that will return
the next fibonacci number.var fib = fibonaccif(0, 1);fib() // 0fib() // 1fib() // 1fib() // 2fib() // 3fib() // 5
![Page 72: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/72.jpg)
function fibonaccif(a, b) { var i = 0; return function () { var next; switch (i) { case 0: i = 1; return a; case 1: i = 2; return b; default: next = a + b; a = b; b = next; return next; } };}
![Page 73: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/73.jpg)
function fibonaccif(a, b) { return function () { var next = a; a = b; b += next; return next; };}
![Page 74: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/74.jpg)
function fibonaccif(a, b) { return concat( concat( once(identityf(a)), once(identityf(b)) ), function fibonacci() { var next = a + b; a = b; b = next; return next; } );}
![Page 75: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/75.jpg)
var single = compuseu(identifyf, once);
function fibonaccif(a, b) { return concat( concat(single(a), single(b)), function fibonacci() { var next = a + b; a = b; b = next; return next; } );}
![Page 76: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/76.jpg)
function fibonaccif(a, b) { return concat( element([a, b]), function fibonacci() { var next = a + b; a = b; b = next; return next; } );}
![Page 77: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/77.jpg)
Write a function m that takes a value and an
optional source string and returns them in an object.
JSON.stringify(m(1))
// {"value": 1, "source": "1"}
JSON.stringify(m(Math.PI, "pi"))
// {"value": 3.14159…, "source": "pi"}
![Page 78: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/78.jpg)
function m(value, source) { return { value: value, source: typeof source === 'string' ? source : String(value) };}
![Page 79: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/79.jpg)
Write a function addm that takes two m objects and
returns an m object.JSON.stringify(addm(m(3), m(4)))
// {"value": 7, "source": "(3+4)"}
JSON.stringify(addm(m(1), m(Math.PI, "pi")))
// {"value": 4.14159…, "source": "(1+pi)"}
![Page 80: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/80.jpg)
function addm(a, b) { return m( a.value + b.value, "(" + a.source + "+" + b.source + ")" );}
![Page 81: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/81.jpg)
Write a function liftm that takes a binary
function and a string and returns a function that
acts on m objects.
var addm = liftm(add, "+");JSON.stringify(addm(m(3), m(4)))// {"value": 7, "source": "(3+4)"}JSON.stringify(liftm(mul, "*")(m(3), m(4)))// {"value": 12, "source": "(3*4)"}
![Page 82: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/82.jpg)
function liftm(binary, op) { return function (a, b) { return m( binary(a.value, b.value), "(" + a.source + op + b.source + ")" ); };}
![Page 83: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/83.jpg)
Modify function liftm so that the functions it produces can accept
arguments that are either numbers or m objects.
var addm = liftm(add, "+");
JSON.stringify(addm(3, 4))
// {"value": 7, "source": "(3+4)"}
![Page 84: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/84.jpg)
function liftm(binary, op) { return function (a, b) { if (typeof a === 'number') { a = m(a); } if (typeof b === 'number') { b = m(b); } return m( binary(a.value, b.value), "(" + a.source + op + b.source + ")" ); };}
![Page 85: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/85.jpg)
Write a function exp that evaluates simple array
expressions.
var sae = [mul, 3, 3];exp(sae) // 9exp(42) // 42
![Page 86: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/86.jpg)
function exp(value) { return Array.isArray(value) ? value[0]( value[1], value[2] ) : value;}
![Page 87: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/87.jpg)
Modify exp to evaluate nested array expressions.
var nae = [ Math.sqrt, [ add, [square, 3], [square, 4] ]];exp(nae) // 5
![Page 88: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/88.jpg)
function exp(value) { return Array.isArray(value) ? value[0]( exp(value[1]), exp(value[2]) ) : value;}
// recursion: a function calls itself
![Page 89: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/89.jpg)
Write a function addg that adds from many
invocations, until it sees an empty invocation.
addg() // undefinedaddg(2)() // 2addg(2)(7)() // 9addg(3)(4)(0)() // 7addg(1)(2)(4)(8)() // 15
![Page 90: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/90.jpg)
function addg(first) { function more(next) { if (next === undefined) { return first; } first += next; return more; } if (first !== undefined) { return more; }}
// retursion: a function returns itself
![Page 91: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/91.jpg)
Write a function liftg that will take a binary
function and apply it to many invocations.
liftg(mul)() // undefinedliftg(mul)(3)() // 3liftg(mul)(3)(4)(0)() // 0liftg(mul)(1)(2)(4)(8)() // 64
![Page 92: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/92.jpg)
function liftg(binary) { return function (first) { if (first === undefined) { return first; } return function more(next) { if (next === undefined) { return first; } first = binary(first, next); return more; }; };}
![Page 93: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/93.jpg)
Write a function arrayg that will build an array from many invocations.
arrayg() // []arrayg(3)() // [3]arrayg(3)(4)(5)() // [3, 4, 5]
![Page 94: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/94.jpg)
function arrayg(first) { var array = []; function more(next) { if (next === undefined) { return array; } array.push(next); return more; } return more(first);}
![Page 95: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/95.jpg)
function arrayg(first) { if (first === undefined) { return []; } return liftg( function (array, value) { array.push(value); return array; } )([first]);}
![Page 96: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/96.jpg)
Make a function continuize that takes a
unary function, and returns a function that takes a callback and an
argument.sqrtc = continuize(Math.sqrt); sqrtc(alert, 81) // 9
![Page 97: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/97.jpg)
function continuize(unary) { return function (callback, x) { return callback(unary(x)); };}
function continuize(any) { return function (callback, ...x) { return callback(any(...x)); };}
![Page 98: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/98.jpg)
function constructor(init) {
var that = other_constructor(init),
member,
method = function () {
// init, member, method
};
that.method = method;
return that;
}
![Page 99: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/99.jpg)
function constructor(spec) {
let {member} = spec,
{other} = other_constructor(spec),
method = function () {
// spec, member, other, method
};
return Object.freeze({
method,
other
});
}
![Page 100: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/100.jpg)
Make an array wrapper object with methods get, store, and append, such that an attacker cannot
get access to the private array.
myvector = vector();myvector.append(7);myvector.store(1, 8);myvector.get(0) // 7myvector.get(1) // 8
![Page 101: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/101.jpg)
function vector() { var array = [];
return { get: function get(i) { return array[i]; }, store: function store(i, v) { array[i] = v; }, append: function append(v) { array.push(v); } };}
![Page 102: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/102.jpg)
function vector() { var array = [];
return { get: function get(i) { return array[i]; }, store: function store(i, v) { array[i] = v; }, append: function append(v) { array.push(v); } }; var stash;} myvector.store('push', function () { stash = this; }); myvector.append(); // stash is array
![Page 103: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/103.jpg)
function vector() { var array = []; return { get: function (i) { return array[+i]; }, store: function store(i, v) { array[+i] = v; }, append: function (v) { array[array.length] = v; } };}
![Page 104: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/104.jpg)
Make a function that makes a publish/subscribe
object. It will reliably deliver all publications to all subscribers in the right
order.
my_pubsub = pubsub();my_pubsub.subscribe(log);my_pubsub.publish("It works!"); // log("It works!")
![Page 105: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/105.jpg)
function pubsub() { var subscribers = []; return { subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { subscribers[i](publication); } } }; }
![Page 106: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/106.jpg)
function pubsub() { var subscribers = []; return { subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { subscribers[i](publication); } } }; }
my_pubsub.subscribe();
![Page 107: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/107.jpg)
function pubsub() { var subscribers = []; return { subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { try { subscribers[i](publication); } catch (ignore) {} } } }; }
"
![Page 108: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/108.jpg)
function pubsub() { var subscribers = []; return { subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { try { subscribers[i](publication); } catch (ignore) {} } } }; } my_pubsub.publish = undefined;
![Page 109: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/109.jpg)
function pubsub() { var subscribers = []; return Object.freeze({ subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { try { subscribers[i](publication); } catch (ignore) {} } } }); }
![Page 110: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/110.jpg)
function pubsub() { var subscribers = []; return Object.freeze({ subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { var i, length = subscribers.length; for (i = 0; i < length; i += 1) { try { subscribers[i](publication); } catch (ignore) {} } } }); } my_pubsub.subscribe(function () { this.length = 0; });
"
![Page 111: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/111.jpg)
function pubsub() { var subscribers = []; return Object.freeze({ subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { subscribers.forEach(function (s) { try { s(publication); } catch (ignore) {} }); } }); }
![Page 112: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/112.jpg)
function pubsub() { var subscribers = []; return Object.freeze({ subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { subscribers.forEach(function (s) { try { s(publication); } catch (ignore) {} }); } }); } my_pubsub.subscribe(once(function () { my_pubsub.publish("Out of order"); }));
"
![Page 113: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/113.jpg)
function pubsub() { var subscribers = []; return Object.freeze({ subscribe: function (subscriber) { subscribers.push(subscriber); }, publish: function (publication) { subscribers.forEach(function (s) { setTimeout(function () { s(publication); }, 0); }); } }); }
"
![Page 114: Save this in an.html file. function log(arg) { document.writeln(arg); } function identity(x) { return x; } log(identity(3));](https://reader036.fdocuments.us/reader036/viewer/2022081502/551a9474550346e0158b52e9/html5/thumbnails/114.jpg)
http://www.crockford.com/pp/problems.pptx