X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=lambda_evaluator.mdwn;h=78fc60cbdc0d7e7c365a1c2014117a9650b72378;hp=230045b9d5338cf198cbbc825b8c9fabdd070657;hb=3a88ab1dea7db2189cbe9b72f2ec17986b8d199d;hpb=5271bbdcd9179cc9ace42a81600420d309214396 diff --git a/lambda_evaluator.mdwn b/lambda_evaluator.mdwn index 230045b9..78fc60cb 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,8 +19,9 @@ 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`, `T`, `M` (aka `ω`) and `L` 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.) +*Variables*: Variables must start with a letter and can continue with any sequence of letters, numbers, `_`, `-`, or `/`. They may optionally end with `?` or `!`. When the evaluator does alpha-conversion, it may change `x` into `x'` or `x''` and so on. But you should not attempt to use primed variable names yourself. +do eta-reductions too @@ -78,13 +77,16 @@ Object.prototype.error = function (message, t) { var parse = make_parse(); function go(source) { - var string, tree, expr; + 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); expr = tree.handler(); - string = expr.to_string() + "\n\n~~>\n\n" + reduce(expr, false, false).to_string(); + // 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);