| OK, you asked! LISP was originally developed as a language for writing recursive functions of symbolic expressions (S-expressions). It was roughly based on lambda calculus, the language developed by Alonzo Church. But roughly is the key word. S-expressions are given by the context-free grammar: S ::= A | [] | (S . S) One can write data structures this way and lists by using the abbreviation: (S1 . (S2 . ( ... ( SK . ()) ...))) == (S1 S2 ... SK) The terms that manipulated these S-expressions were called M-expressions. They were first-order terms. McCarthy's key idea was to use a conditional in conjunction with a label form to define recursive functions (in the service of various AI applications). The M-expressions were defined roughly as follows: M ::= S | x | if[M; M; M] | f[M; ...; M] f ::= lambda[[x1; ...; xn]; M] | label[g; M] (I'm not 100% confident that I remember the exact details on this syntax but the idea is correct!) McCarthy wanted to show that his new language was Turing-complete. So he wanted to exhibit a universal function APPLY (derivable from f above) such that for any function f and arguments M1; ...; Mk such that f[M1; ...; Mk] evaluates to S-expression S, well, given a representation of f[M1;...;Mk], lets call it, hat(f[M1;...;Mk]), well APPLY[hat(f); hat(M1);...;hat(Mk)] would evaluate to hat(S). This is pretty much a standard formulation of the recursion-theoretic argument. In order to close the sale, McCarthy had to exhibit such an APPLY and also the hat(.) function.
Sadly for all of us LISP lovers (!) he botched the definition of hat(.)! It left people utterly confused for 30+ years. Such a shame. Fixed a couple of typos. Sorry! Fixed one other typo! It's been a while... |