X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=lambda_evaluator.mdwn;h=4a5b9dc0ec39a17f14cf4c564148b40acc9252e5;hp=180757c15323df6665c0b7be8d2a23c196ecc95c;hb=ce6877027e00cdb159651cddba03addb5208e875;hpb=4cf8f3d9e4dd738618941cfce954d705496db973 diff --git a/lambda_evaluator.mdwn b/lambda_evaluator.mdwn index 180757c1..4a5b9dc0 100644 --- a/lambda_evaluator.mdwn +++ b/lambda_evaluator.mdwn @@ -1,6 +1,3 @@ -Lambda Evaluator ----------------- - This lambda evaluator will allow you to write lambda terms and evaluate (that is, normalize) them, and inspect the results. (This won't work in Racket, because Racket doesn't even try to represent the internal structure of a function in a human-readable way.) @@ -22,7 +19,7 @@ Blank lines are fine. *Abbreviations*: In an earlier version, you couldn't use abbreviations. `\x y. y x x` had to be written `(\x (\y ((y x) x)))`. We've upgraded the parser though, so now it should be able to understand any lambda term that you can. -*Constants*: (NOT YET IMPLEMENTED!) The combinators `S`, `K`, `I`, `C`, `B`, `W`, and `T` are pre-defined to their standard values. Also, integers will automatically be converted to Church numerals. (`0` is `\s z. z`, `1` is `\s z. s z`, and so on.) +*Constants*: The combinators `S`, `K`, `I`, `C`, `B`, `W`, and `T` are pre-defined to their standard values. Also, integers will automatically be converted to Church numerals. (`0` is `\s z. z`, `1` is `\s z. s z`, and so on.) @@ -38,6 +35,7 @@ let and = \l r. l r false in ) +do eta-reductions too @@ -78,12 +76,16 @@ Object.prototype.error = function (message, t) { var parse = make_parse(); function go(source) { - var string, tree; + var string, tree, expr, eta; try { tree = parse(source); -// string = JSON.stringify(tree, ['key', 'name', 'message', 'value', 'arity', 'first', 'second', 'third', 'fourth'], 4); -// string = JSON.stringify(tree.handler(), ['key', 'name', 'message', 'value', 'arity', 'first', 'second', 'tag', 'variable', 'left', 'right', 'bound', 'body' ], 4); - string = tree.handler().to_string(); + // 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); @@ -119,5 +121,4 @@ The code is based on: Improvements we hope to add soon: the ability to reduce Combinatory Logic combinators and report the result as combinators, rather than in lambda forms. -For these assignments, you'll probably want to use a "lambda calculator" to check your work. This accepts any grammatical lambda expression and reduces it to normal form, when possible. See our [lambda-let page](/lambda-let.html),