|
|
|
|
|
by dogfishbar
3626 days ago
|
|
Fair enough, I felt I was droning on but it's true that I didn't show the key mistake. Here it is. If you want to represent an arbitrary M-expression as an M-expression, it's most natural to use S-expressions for the representation language, these are the -values- in M-expression LISP. (In lambda calculus we have more choices, normal-forms or weak-head normal-forms). McCarthy defined hat(.), naturally enough, by induction on the structure of M-expressions. For each M-expression, we need an S-expression representation. (Note that we use uppercase symbols for the symbolic constants and lowercase symbols for identifiers.) Here goes: hat(S) == (QUOTE S) hat(x) == X hat(if[M1; M2; M3]) == (IF hat(M1) hat(M2) hat(M3)) etc.. But HOLD ON! The S-expressions have inductive structure(!). The definition of hat(S) should have been: hat(A) == (SYM A) hat(()) == (NIL) hat((S1 . S2)) == (PAIR hat(S1) hat(S2)) There are sensible mathematical properties that this latter representation has that the former doesn't. It's a bit of a long story. But the bottom line is that QUOTE, was defined erroneously. (And John McCarthy burst out laughing when I explained it to him.) RM apologies, more typos. |
|
BTW, the M-expression syntax for IF was "test -> consequent; alternative" which got encoded as a COND expression. (Doesn't matter, I'm just pointing it out as long as I'm commenting.)