new text
authorChris Barker <barker@kappa.linguistics.fas.nyu.edu>
Sat, 25 Sep 2010 16:54:59 +0000 (12:54 -0400)
committerChris Barker <barker@kappa.linguistics.fas.nyu.edu>
Sat, 25 Sep 2010 16:54:59 +0000 (12:54 -0400)
assignment3.mdwn [new file with mode: 0644]

diff --git a/assignment3.mdwn b/assignment3.mdwn
new file mode 100644 (file)
index 0000000..d00dba0
--- /dev/null
@@ -0,0 +1,95 @@
+Assignment 3
+------------
+
+Once again, the lambda evaluator will make working through this
+assignment much faster and more secure.
+
+*Writing recursive functions on version 1 style lists*
+
+Recall that version 1 style lists are constructed like this:
+
+<textarea id="INPUT" style="border: 2px solid black; color: black; font-family: monospace; height: 3in; overflow: auto; padding: 0.5em; width: 100%;">
+let true = \x y. x in
+let false = \x y. y in
+let makePair = \f s g. g f s in
+let nil = makePair true meh in
+let makeList = \h t. makePair false (makePair h t) in
+let mylist = makeList 1 (makeList 2 (makeList 3 nil)) in
+let fst = true in
+let snd = false in
+let isNil = \x. x fst in
+let head = \l. isNil l err (l snd fst) in
+let tail = \l. isNil l err (l snd snd) in
+let succ = \n s z. s (n s z) in
+let Y = \f. (\h. f (h h)) (\h. f (h h)) in
+let length = Y (\length l. isNil l 0 (succ (length (tail l)))) in
+
+length mylist
+</textarea>
+<input id="PARSE" value="Normalize" type="button">
+<input id="ETA" type="checkbox">do eta-reductions too
+<noscript><p>You may not see it because you have JavaScript turned off. Uffff!</p></noscript>
+<script src="/code/lambda.js"></script>
+<script src="/code/tokens.js"></script>
+<script src="/code/parse.js"></script>
+<script src="/code/json2.js"></script>
+<pre id="OUTPUT">
+</pre>
+<script>
+/*jslint evil: true */
+
+/*members create, error, message, name, prototype, stringify, toSource,
+    toString, write
+*/
+
+/*global JSON, make_parse, parse, source, tree */
+
+// Make a new object that inherits members from an existing object.
+
+if (typeof Object.create !== 'function') {
+    Object.create = function (o) {
+        function F() {}
+        F.prototype = o;
+        return new F();
+    };
+}
+
+// Transform a token object into an exception object and throw it.
+
+Object.prototype.error = function (message, t) {
+    t = t || this;
+    t.name = "SyntaxError";
+    t.message = message;
+    throw t;
+};
+
+
+(function () {
+    var parse = make_parse();
+
+    function go(source) {
+        var string, tree, expr, eta;
+        try {
+            tree = parse(source);
+ //           string = JSON.stringify(tree, ['key', 'name', 'message', 'value', 'arity', 'first', 'second', 'third', 'fourth'], 4);
+                       expr = tree.handler();
+            // string = JSON.stringify(expr, ['key', 'name', 'message', 'value', 'arity', 'first', 'second', 'tag', 'variable', 'left', 'right', 'bound', 'body' ], 4);
+//                     string = expr.to_string() + "\n\n~~>\n\n";
+                       string = '';
+                       eta = document.getElementById('ETA').checked;
+                       string = string + reduce(expr, eta, false).to_string();
+        } catch (e) {
+            string = JSON.stringify(e, ['name', 'message', 'from', 'to', 'key',
+                    'value', 'arity', 'first', 'second', 'third', 'fourth'], 4);
+        }
+        document.getElementById('OUTPUT').innerHTML = string
+            .replace(/&/g, '&amp;')
+            .replace(/[<]/g, '&lt;');
+    }
+
+    document.getElementById('PARSE').onclick = function (e) {
+        go(document.getElementById('INPUT').value);
+    };
+}());
+
+</script>