Lisp Interpreter for mbed LPC1768

Dependencies:   mbed

Lisp Interpreter

(Marc Adler Lisp Interpreter, malisp)

mbed LPC1768 port by Takehisa Oneta (ohneta@gmail.com)

Files at this revision

API Documentation at this revision

Comitter:
ohneta
Date:
Sat May 21 22:26:40 2016 +0000
Parent:
0:e9a7a38d9ad3
Commit message:
??commit

Changed in this revision

malisp.cpp Show annotated file Show diff for this revision Revisions of this file
malisp.h Show annotated file Show diff for this revision Revisions of this file
diff -r e9a7a38d9ad3 -r a2955606adef malisp.cpp
--- a/malisp.cpp	Sun Apr 17 11:59:13 2016 +0000
+++ b/malisp.cpp	Sat May 21 22:26:40 2016 +0000
@@ -162,8 +162,8 @@
     init("add1",  ADD1);
     init("sub1",  SUB1);
     init("quot",  QUOTIENT);
-    TRU = cons(init("t",T), NULL);
-    init("numberp",NUMBERP);
+    TRU = cons(init("t", T), NULL);
+    init("numberp", NUMBERP);
     rplact(TRU, SATOM);
     init("null",  NUL);
     init("funcall",FUNCALL);
@@ -171,6 +171,7 @@
     // for mbed functions
     init("info", FINFO);
     init("freemem", FFREEMEM);
+
     init("wait", FWAIT);
     init("dout", FDOUT);
     init("din",  FDIN);
@@ -183,10 +184,9 @@
 
 LIST *init(char *name, int t)
 {
-    LIST *p;
+    LIST *p = install(name, false);
+    rplact(p, t);
 
-    p = install(name, 1);
-    rplact(p, t);
     return p;
 }
 
@@ -233,24 +233,26 @@
 // isp_print - walks along the list structure printing atoms
 void lisp_print(LIST *p)
 {
-    if (p != NULL) {
-        if (type(p) == RATOM) {
-            pc.printf("%f ", p->u.num);
-        } else if (type(p) == IATOM) {
-            pc.printf("%d ", (int) p->u.num);
-        } else if (type(p) == SATOM) {
-            pc.printf("%s ", getname(car(p)));
-        } else if (type(car(p)) == LST) {
-            pc.printf("%c", '(');
-            lisp_print(car(p));
-            pc.printf("%c", ')');
-            lisp_print(cdr(p));
-        } else if (type(p) == LST) {
-            lisp_print(car(p));
-            lisp_print(cdr(p));
-        } else {
-            pc.printf("******** can't print it out *******\n");
-        }
+    if (p == NULL) {
+        return;
+    }
+
+    if (type(p) == RATOM) {
+        pc.printf("%f ", p->u.num);
+    } else if (type(p) == IATOM) {
+        pc.printf("%d ", (int) p->u.num);
+    } else if (type(p) == SATOM) {
+        pc.printf("%s ", getname(car(p)));
+    } else if (type(car(p)) == LST) {
+        pc.printf("%c", '(');
+        lisp_print(car(p));
+        pc.printf("%c", ')');
+        lisp_print(cdr(p));
+    } else if (type(p) == LST) {
+        lisp_print(car(p));
+        lisp_print(cdr(p));
+    } else {
+        pc.printf("******** can't print it out *******\n");
     }
 }
 
@@ -414,14 +416,6 @@
         // mbed expand
         case FINFO:
         {
-/*
-pc.printf("alist --\n");
-            work_garbageCollect(g_alist);
-pc.printf("oblist --\n");
-            work_garbageCollect(g_oblist);
-*/
-//pc.printf("alist --\n");
-//debug(g_alist);
 pc.printf("\noblist --\n");
 debug(g_oblist);
 
@@ -438,9 +432,11 @@
         case FWAIT:
         {
             LIST * p = mbed_wait(eval(car(cdr(x)), alist));
+/*
             if (p != NULL) {
                 p->gcbit = GARBAGE;
             }
+*/
             return p;
         }
         case FDOUT:
@@ -636,21 +632,23 @@
     return ((p == NULL) ? NULL : car(p));
 }
 
-LIST *install(char *name, int nameConstKind = 0)
+/**
+ * nameをalistに加える
+ *
+ * @param char *name alistに加える名前
+ * @param bool nameCopyFlag nameをコピーするか否か。 true=コピーする、1=コピーしない(nameがconstな文字列)
+ */
+LIST *install(char *name, bool nameCopyFlag = true)
 {
-    LIST *p;
+    LIST *p = cons(NULL, NULL);
 
-    p = cons(NULL, NULL);
-#if 0
-    strcpy(p->u.pname = (char *)emalloc(strlen(name) + 1), name);
-#else
-if (nameConstKind == 0) {    
-    p->u.pname = (char *)emalloc(strlen(name) + 1);
-    strcpy(p->u.pname, name);
-} else {
-    p->u.pname = name;
-}
-#endif
+    if (nameCopyFlag) {
+        p->u.pname = (char *)emalloc(strlen(name) + 1);
+        strcpy(p->u.pname, name);
+    } else {
+        p->u.pname = name;
+    }
+
     rplact(p, VARI);
     g_alist = cons(p, g_alist);
 
@@ -691,29 +689,32 @@
 {
     LIST *p;
 
-    char inbuf[120];
+    char inbuf[120];    // トークン 1つ分のバッファ
     char *s = inbuf;
     LIST *idptr;
 
-    int c = getc_mine(fd);
-    *s = c;
-    s++;
-    if (c != '\'') {
-        while(1) {
-            c = getc_mine(fd);
-            if (!isalnum(c)) {
-                ungetc_mine(c, fd);
-                break;
+    // トークンを取得する
+    {
+        int c = getc_mine(fd);
+        *s = c;
+        s++;
+        if (c != '\'') {
+            while(1) {
+                c = getc_mine(fd);
+                if (!isalnum(c)) {
+                    ungetc_mine(c, fd);
+                    break;
+                }
+                *s = c;
+                s++;
             }
-            *s = c;
-            s++;
         }
+        *s = '\0';
     }
-    *s = '\0';
 
     if ((idptr = lookup(g_oblist, inbuf)) == NULL) {    // not a LISP function
         if ((idptr = lookup(g_alist, inbuf)) == NULL) { // id not declared yet
-            idptr = install(inbuf, 0);                     // install it in g_alist (alist)
+            idptr = install(inbuf, true);               // install it in g_alist (alist)
         }
     }
     p = cons(idptr, NULL);
@@ -810,16 +811,6 @@
 {
     LIST *x = new_malisp();
 
-/*
-// for debug
-{
-    static int num = 0;
-    x->gcbit = (num << 16) | x->gcbit;
-pc.printf("cons-num(%08x): %d\n", x->gcbit, num);
-
-    num++;
-}
-*/
     rplaca(x, p);
     rplacd(x, q);
     rplact(x, LST);
@@ -833,7 +824,9 @@
         if (x == y) {
             return TRU;
         }
-    } else if (type(x) == SATOM && type(y) == SATOM && car(x) == car(y)) {
+    } else if ( (type(x) == SATOM) &&
+                (type(y) == SATOM) &&
+                (car(x) == car(y))  ) {
         return TRU;
     }
 
@@ -842,12 +835,28 @@
 
 LIST *atom(LIST *x)
 {
+#if 0
     int typ;
 
     if (x == NULL || (typ = type(x)) == IATOM || typ == RATOM || typ == SATOM) {
         return TRU;
     }
-
+#else
+    if (x == NULL) {
+        return TRU;
+    }
+    
+    int typ = type(x);
+    if (typ == IATOM) {
+         return TRU;
+    }
+    if (typ == RATOM) {
+         return TRU;
+    }
+    if (typ == SATOM) {
+         return TRU;
+    }
+#endif
     return NULL;
 }
 
@@ -958,8 +967,8 @@
             pc.printf(" : ");
         }
 
-        pc.printf("%d : ", (p->gcbit >> 16) & 0xff);    // num
-        pc.printf("%d \n", (p->gcbit & 0xff));          // bit (USED/RUNNING)
+        //pc.printf("%d : ", (p->gcbit >> 16) & 0xff);    // num
+        //pc.printf("%d \n", (p->gcbit & 0xff));          // bit (USED/RUNNING)
         
         p = cdr(p);
         cnt++;
diff -r e9a7a38d9ad3 -r a2955606adef malisp.h
--- a/malisp.h	Sun Apr 17 11:59:13 2016 +0000
+++ b/malisp.h	Sat May 21 22:26:40 2016 +0000
@@ -18,15 +18,15 @@
 
 
 // token types
-#define IATOM   6
-#define RATOM   7
-#define SATOM   8
-#define FUNC    9
-#define LST     10
-#define VARI    11
-#define QUOTE   12
-#define NILL    13
-#define T       14
+#define IATOM   6       // 整数ATOM
+#define RATOM   7       // 実数ATOM (float)
+#define SATOM   8       // 文字列ATOM
+#define FUNC    9       // 関数
+#define LST     10      // リスト
+#define VARI    11      // 変数
+#define QUOTE   12      // クオート
+#define NILL    13      // nil
+#define T       14      // t
 #define COND    15
 #define DEFUN   16
 #define FCAR    17
@@ -91,17 +91,16 @@
 
 
 typedef struct LIST {
-  //uint32_t    cons_num;
-  
-  //char      gcbit;
-  uint32_t  gcbit;
-  int32_t   htype;
-  union {
-    float num;
-    char  *pname;
-  } u;
-  struct LIST  *left;
-  struct LIST  *right;
+
+    uint32_t  gcbit;
+
+    int32_t   htype;
+    union {
+        float num;
+        char  *pname;
+    } u;
+    struct LIST  *left;
+    struct LIST  *right;
 } LIST;
 
 
@@ -125,6 +124,7 @@
 
 void initialize();
 LIST *init(char *name, int t);
+
 LIST *makelist();
 void lisp_print(LIST *p);
 LIST *eval(LIST *x, LIST *alist);
@@ -138,7 +138,8 @@
 int advance();
 LIST *lookup(LIST *head, char *name);
 //LIST *install(char *name);
-LIST *install(char *name, int nameConstKind);
+//LIST *install(char *name, int nameConstKind);
+LIST *install(char *name, bool nameCopyFlag);
 
 LIST *getnum();
 LIST *getid();