Inline Evaluate into Eval (it looks nicer)

This commit is contained in:
Justine Tunney 2021-11-22 17:52:05 -08:00
parent c549796f78
commit 6000841378

99
lisp.c
View file

@ -47,25 +47,6 @@ int cx; /* stores negative memory use */
int dx; /* stores lookahead character */ int dx; /* stores lookahead character */
int RAM[0100000]; /* your own ibm7090 */ int RAM[0100000]; /* your own ibm7090 */
Car(x) {
return M[x];
}
Cdr(x) {
return M[x + 1];
}
Cons(car, cdr) {
M[--cx] = cdr;
M[--cx] = car;
return cx;
}
Gc(x, m, k) {
return x < m ? Cons(Gc(Car(x), m, k),
Gc(Cdr(x), m, k)) + k : x;
}
Intern() { Intern() {
int i, j, x; int i, j, x;
for (i = 0; (x = M[i++]);) { for (i = 0; (x = M[i++]);) {
@ -149,7 +130,7 @@ PrintAtom(x) {
PrintList(x) { PrintList(x) {
PrintChar('('); PrintChar('(');
PrintObject(Car(x)); PrintObject(Car(x));
while ((x = Cdr(x)) != 0) { while ((x = Cdr(x))) {
if (x < 0) { if (x < 0) {
PrintChar(' '); PrintChar(' ');
PrintObject(Car(x)); PrintObject(Car(x));
@ -179,16 +160,47 @@ Print(e) {
The LISP Challenge § Bootstrap John McCarthy's Metacircular Evaluator The LISP Challenge § Bootstrap John McCarthy's Metacircular Evaluator
*/ */
Pairlis(x, y, a) { Car(x) {
if (!x) return a; return M[x];
return Cons(Cons(Car(x), Car(y)), }
Pairlis(Cdr(x), Cdr(y), a));
Cdr(x) {
return M[x + 1];
}
Cons(car, cdr) {
M[--cx] = cdr;
M[--cx] = car;
return cx;
}
Gc(x, m, k) {
return x < m ? Cons(Gc(Car(x), m, k),
Gc(Cdr(x), m, k)) + k : x;
} }
Evlis(m, a) { Evlis(m, a) {
if (!m) return 0; return m ? Cons(Eval(Car(m), a),
return Cons(Eval(Car(m), a), Evlis(Cdr(m), a)) : 0;
Evlis(Cdr(m), a)); }
Pairlis(x, y, a) {
return x ? Cons(Cons(Car(x), Car(y)),
Pairlis(Cdr(x), Cdr(y), a)) : a;
}
Assoc(x, y) {
if (!y) return 0;
if (x == Car(Car(y))) return Cdr(Car(y));
return Assoc(x, Cdr(y));
}
Evcon(c, a) {
if (Eval(Car(Car(c)), a)) {
return Eval(Car(Cdr(Car(c))), a);
} else {
return Evcon(Cdr(c), a);
}
} }
Apply(f, x, a) { Apply(f, x, a) {
@ -201,33 +213,18 @@ Apply(f, x, a) {
if (f == kCdr) return Cdr(Car(x)); if (f == kCdr) return Cdr(Car(x));
} }
Evaluate(e, a) {
if (e < 0) {
if (Car(e) == kQuote) return Car(Cdr(e));
if (Car(e) == kCond) return Evcon(Cdr(e), a);
return Apply(Car(e), Evlis(Cdr(e), a), a);
}
return Assoc(e, a);
}
Evcon(c, a) {
if (Eval(Car(Car(c)), a)) {
return Eval(Car(Cdr(Car(c))), a);
} else {
return Evcon(Cdr(c), a);
}
}
Assoc(x, y) {
if (!y) return 0;
if (x == Car(Car(y))) return Cdr(Car(y));
return Assoc(x, Cdr(y));
}
Eval(e, a) { Eval(e, a) {
int A, B, C; int A, B, C;
if (e >= 0)
return Assoc(e, a);
if (Car(e) == kQuote)
return Car(Cdr(e));
A = cx; A = cx;
e = Evaluate(e, a); if (Car(e) == kCond) {
e = Evcon(Cdr(e), a);
} else {
e = Apply(Car(e), Evlis(Cdr(e), a), a);
}
B = cx; B = cx;
e = Gc(e, A, A - B); e = Gc(e, A, A - B);
C = cx; C = cx;