Documentation
Commentary
This file provides an interpreter for untyped lambda calculus
expressions.
* Use:
To evaluate a lambda calculus expression, type in the following,
replacing <expression> with the desired expression.
M-x lc-eval-expression RET (<expression>) RET
Note that the expression must be surrounded by a set of
parentheses. Omit the period in `lambda' constructs.
To define a metavariable, evaluate the following code, replacing
<varname> with the name of the metavariable, and <expression> with
the desired expression.
(lc-def <varname> (<expression>))
If you wish to evaluate lambda calculus expressions
programmatically, you can use the `lc-eval' macro, which takes
something of the form (<expression>). There is no need to quote
the expression.
To see each individual step of the evaluation process, do the
following. By default, the expressions are pretty-printed; to
change that, customize the `lc-enable-pp' option.
M-x lc-step-expression RET (<expression>) RET
* Implementation details:
This interpreter works in several stages.
** Translation (Lambda Calculus -> Emacs Lisp):
The first step is translation from a lambda calculus expression to
an Emacs Lisp expression. This involves determining bound and free
variables, and replacing implicit function calls with explicit
calls to `lc-apply'.
** Evaluation:
The next step is to evaluate the translated expression, namely:
substituting previously-defined expressions for free variables and
repeatedly applying function calls until a lambda expression is
reached.
In order to prevent infinite evaluation, a limit has been placed on
the number of consecutive evaluations that are permitted. The
default is 50. To change this, customize the `lc-max-steps'
option.
** Untranslation (Emacs Lisp -> Lambda Calculus):
The final step is to take the result from evaluation and make it
look like a lambda calculus expression. This involves removing the
"bound" and "free" prefixes from variables, removing calls to
`lc-apply', and making the resulting expression as minimal as
possible.
* Credits:
Most of the environment comes from the Types and Programming
Languages textbook by Benjamin C. Pierce. As far as I can tell,
these sample definitions are considered common knowledge, so I
should be able to distribute them.
A couple of the functions of the environment are from
<http://www.onebadseed.com/blog/?p=34>, but were modified to use a
single-argument lambda form.
Thanks go to Riastradh on #emacs for suggesting that I use
functions rather than the macro mess I previously had.
* Endorsements:
From an IRC chat on #hcoop:
<mwolson> i'm currently making a lambda calculus interpreter in
Emacs Lisp
* Smerdyakov gags. :D
From an IRC chat on #emacs:
* mwolson is tantalizingly close to having the final piece of his
lambda calculus interpreter (in Emacs Lisp) done
<forcer> :-)
<offby1> *shudder*
Requires
Dependencies
Consumers
Reverse Dependencies
No reverse dependencies recorded.