cleanup
[lambda.git] / lambda_evaluator.mdwn
index d46fc78..d39086f 100644 (file)
@@ -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*: 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 <code>&omega;</code>) 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.
 
 
 <textarea id="INPUT" style="border: 2px solid black; color: black; font-family: monospace; height: 3in; overflow: auto; padding: 0.5em; width: 100%;">
@@ -38,6 +36,7 @@ let and = \l r. l r false in
 )
 </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>
@@ -78,7 +77,7 @@ 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);
@@ -86,7 +85,8 @@ Object.prototype.error = function (message, t) {
             // 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 = '';
-                       string = string + reduce(expr, false, false).to_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);
@@ -120,6 +120,25 @@ The code is based on:
 *      [Oleg Kiselyov's Haskell lambda calculator](http://okmij.org/ftp/Computation/lambda-calc.html#lambda-calculator-haskell).
 *      The top-down JavaScript lexer and parser at <http://javascript.crockford.com/tdop/index.html>.
 
-Improvements we hope to add soon: the ability to reduce Combinatory Logic combinators and report the result as combinators, rather than in lambda forms.
+Improvements we hope to add:
+
+*      detecting some common cases of non-normalizing terms (the problem of determining in general whether a term will normalize is undecidable)
+*      returning results in combinator form (the evaluator already accepts combinators as input)
+*      displaying reductions one step at a time
+*      specifying the reduction order and depth
+*      allow other binders such as &forall; and &exist; (though these won't be interpreted as doing anything other than binding variables)
+
+<a name="other_evaluators"></a>
+Other Lambda Evaluators/Calculutors
+-----------------------------------
+
+*      [Peter Sestoft's Lambda Calculus Reducer](http://www.itu.dk/people/sestoft/lamreduce/index.html): Very nice! Allows you to select different evaluation strategies, and shows stepwise reductions.
+*      [Chris Barker's Lambda Tutorial](http://homepages.nyu.edu/~cb125/Lambda)
+*      [Penn Lambda Calculator](http://www.ling.upenn.edu/lambda/): Pedagogical software developed by Lucas Champollion, Josh Tauberer and Maribel Romero.  Linguistically oriented. Requires installing Java (Mac users will probably already have it installed).
+*      [Mike Thyer's Lambda Animator](http://thyer.name/lambda-animator/): Graphical tool for experimenting with different reduction strategies. Also requires installing Java, and Graphviz.
+*      [Matt Might's Lambda Evaluator](http://matt.might.net/articles/implementing-a-programming-language/) in Scheme (R5RS and Racket).
+
+See also:
 
+*      [Jason Jorendorff's Try Scheme](http://tryscheme.sourceforge.net/about.html): Runs a miniature Scheme interpreter in Javascript, in your browser.