ソースを参照

Implement READ and PRINT in lisp.c (#24)

Hikaru Ikuta 3 年 前
コミット
c425dee531
1 ファイル変更27 行追加15 行削除
  1. 27 15
      lisp.c

+ 27 - 15
lisp.c

@@ -34,14 +34,16 @@
 #define kT          4
 #define kQuote      6
 #define kCond       12
-#define kAtom       17
-#define kCar        22
-#define kCdr        26
-#define kCons       30
-#define kEq         35
+#define kRead       17
+#define kPrint      22
+#define kAtom       28
+#define kCar        33
+#define kCdr        37
+#define kCons       41
+#define kEq         46
 
 #define M (RAM + sizeof(RAM) / sizeof(RAM[0]) / 2)
-#define S "NIL\0T\0QUOTE\0COND\0ATOM\0CAR\0CDR\0CONS\0EQ"
+#define S "NIL\0T\0QUOTE\0COND\0READ\0PRINT\0ATOM\0CAR\0CDR\0CONS\0EQ"
 
 int cx; /* stores negative memory use */
 int dx; /* stores lookahead character */
@@ -149,6 +151,9 @@ PrintObject(x) {
 
 Print(e) {
   PrintObject(e);
+}
+
+PrintNewLine() {
   PrintChar('\n');
 }
 
@@ -176,8 +181,12 @@ Gc(x, m, k) {
 }
 
 Evlis(m, a) {
-  return m ? Cons(Eval(Car(m), a),
-                  Evlis(Cdr(m), a)) : 0;
+  if (m) {
+    int x = Eval(Car(m), a);
+    return Cons(x, Evlis(Cdr(m), a));
+  } else {
+    return 0;
+  }
 }
 
 Pairlis(x, y, a) {
@@ -200,13 +209,15 @@ Evcon(c, a) {
 }
 
 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));
+  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));
+  if (f == kRead)  return Read();
+  if (f == kPrint) return (x ? Print(Car(x)) : PrintNewLine()), 0;
 }
 
 Eval(e, a) {
@@ -242,5 +253,6 @@ main() {
   for (;;) {
     cx = 0;
     Print(Eval(Read(), 0));
+    PrintNewLine();
   }
 }