瀏覽代碼

Inline Evaluate into Eval (it looks nicer)

Justine Tunney 3 年之前
父節點
當前提交
6000841378
共有 1 個文件被更改,包括 44 次插入47 次删除
  1. 44 47
      lisp.c

+ 44 - 47
lisp.c

@@ -47,25 +47,6 @@ int cx; /* stores negative memory use */
 int dx; /* stores lookahead character */
 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() {
   int i, j, x;
   for (i = 0; (x = M[i++]);) {
@@ -149,7 +130,7 @@ PrintAtom(x) {
 PrintList(x) {
   PrintChar('(');
   PrintObject(Car(x));
-  while ((x = Cdr(x)) != 0) {
+  while ((x = Cdr(x))) {
     if (x < 0) {
       PrintChar(' ');
       PrintObject(Car(x));
@@ -179,35 +160,39 @@ Print(e) {
 │ The LISP Challenge § Bootstrap John McCarthy's Metacircular Evaluator    ─╬─│┼
 ╚────────────────────────────────────────────────────────────────────────────│*/
 
-Pairlis(x, y, a) {
-  if (!x) return a;
-  return Cons(Cons(Car(x), Car(y)),
-              Pairlis(Cdr(x), Cdr(y), a));
+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;
 }
 
 Evlis(m, a) {
-  if (!m) return 0;
-  return Cons(Eval(Car(m), a),
-              Evlis(Cdr(m), a));
+  return m ? Cons(Eval(Car(m), a),
+                  Evlis(Cdr(m), a)) : 0;
 }
 
-Apply(f, x, a) {
-  if (f < 0)      return Eval(Car(Cdr(Cdr(f))), Pairlis(Car(Cdr(f)), x, a));
-  if (f > kEq)    return Apply(Eval(f, a), x, a);
-  if (f == kEq)   return Car(x) == Car(Cdr(x)) ? kT : 0;
-  if (f == kCons) return Cons(Car(x), Car(Cdr(x)));
-  if (f == kAtom) return Car(x) < 0 ? 0 : kT;
-  if (f == kCar)  return Car(Car(x));
-  if (f == kCdr)  return Cdr(Car(x));
+Pairlis(x, y, a) {
+  return x ? Cons(Cons(Car(x), Car(y)),
+                  Pairlis(Cdr(x), Cdr(y), a)) : a;
 }
 
-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);
+Assoc(x, y) {
+  if (!y) return 0;
+  if (x == Car(Car(y))) return Cdr(Car(y));
+  return Assoc(x, Cdr(y));
 }
 
 Evcon(c, a) {
@@ -218,16 +203,28 @@ Evcon(c, a) {
   }
 }
 
-Assoc(x, y) {
-  if (!y) return 0;
-  if (x == Car(Car(y))) return Cdr(Car(y));
-  return Assoc(x, Cdr(y));
+Apply(f, x, a) {
+  if (f < 0)      return Eval(Car(Cdr(Cdr(f))), Pairlis(Car(Cdr(f)), x, a));
+  if (f > kEq)    return Apply(Eval(f, a), x, a);
+  if (f == kEq)   return Car(x) == Car(Cdr(x)) ? kT : 0;
+  if (f == kCons) return Cons(Car(x), Car(Cdr(x)));
+  if (f == kAtom) return Car(x) < 0 ? 0 : kT;
+  if (f == kCar)  return Car(Car(x));
+  if (f == kCdr)  return Cdr(Car(x));
 }
 
 Eval(e, a) {
   int A, B, C;
+  if (e >= 0)
+    return Assoc(e, a);
+  if (Car(e) == kQuote)
+    return Car(Cdr(e));
   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;
   e = Gc(e, A, A - B);
   C = cx;