Lisp Interpreter for mbed LPC1768

Dependencies:   mbed

Lisp Interpreter

(Marc Adler Lisp Interpreter, malisp)

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

Revision:
0:e9a7a38d9ad3
Child:
1:a2955606adef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/malisp.h	Sun Apr 17 11:59:13 2016 +0000
@@ -0,0 +1,174 @@
+/**
+ *
+ */
+
+#ifndef MALISP_H
+#define MALISP_H
+
+
+#define FALSE   0
+#define TRUE    1
+
+// input types
+#define INQUOTE 1
+#define LPAREN  2
+#define RPAREN  3
+#define LETTER  4
+#define DIGIT   5
+
+
+// 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 COND    15
+#define DEFUN   16
+#define FCAR    17
+#define FCDR    18
+#define FCONS   19
+#define FEQ     20
+#define FATOM   21
+#define FQUOTE  22
+#define FSETQ   23
+#define FUSER   24
+#define PLUS    25
+#define DIFF    26
+#define TIMES   27
+#define QUOTIENT    28
+#define ADD1    29
+#define SUB1    30
+#define ZEROP   31
+#define NUMBERP 32
+#define GREATERP    33
+#define LESSP   34
+#define PRINT   35
+#define NUL     36
+#define FUNCALL 37
+#define PROG    38
+#define GO      39
+#define RETRN   40
+#define LABL    41
+#define FREAD   42
+#define FREPLACA    43
+#define FREPLACD    44
+#define FEVAL   45
+#define FAPPLY  46
+
+/*
+// for garbage collection
+#define GARBAGE 47
+#define USED    48
+#define RUNNING 49
+*/
+#define GARBAGE 0
+#define USED    1
+#define RUNNING 2
+
+
+// more primitives
+#define FAND    50
+#define FOR     51
+#define FNOT    52
+#define FLIST   53
+
+#define ERR     -2
+
+// mbed extpand functions
+#define FINFO       55
+#define FFREEMEM    59
+#define FWAIT       60
+#define FDOUT       61
+#define FDIN        62
+#define FAOUT       63
+#define FAIN        64
+#define PWMOUT      65
+
+
+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;
+} LIST;
+
+
+
+#define     FILE_MINE   int32_t
+#define     FILE_SERIAL     2
+#define     FILE_STRING     3
+
+
+
+// Prototypes
+int getc_mine(FILE_MINE fd);
+void ungetc_mine(int c, FILE_MINE fd);
+
+size_t _getFreeMemorySize();
+LIST *memfreesize();
+
+
+void malisp_main();
+void interpret_malisp();
+
+void initialize();
+LIST *init(char *name, int t);
+LIST *makelist();
+void lisp_print(LIST *p);
+LIST *eval(LIST *x, LIST *alist);
+LIST *evalcond(LIST *expr, LIST *alist);
+LIST *evalprog(LIST *p, LIST *alist);
+LIST *pairargs(LIST *params, LIST *args, LIST *alist, int prog);
+LIST *evalargs(LIST *arglist, LIST *alist);
+LIST *assoc( LIST *alist, char *name);
+LIST *getvar(LIST *alist, char *name);
+LIST *arith(LIST *op, LIST *x, LIST *y);
+int advance();
+LIST *lookup(LIST *head, char *name);
+//LIST *install(char *name);
+LIST *install(char *name, int nameConstKind);
+
+LIST *getnum();
+LIST *getid();
+int gettok();
+LIST *new_malisp();
+int type(LIST *p);
+char* getname(LIST *p);
+void rplaca(LIST *p, LIST *q);
+void rplacd(LIST *p, LIST *q);
+void rplact( LIST *p, int t);
+LIST *car(LIST *p);
+LIST *cdr(LIST *p);
+LIST *cons(LIST *p, LIST *q);
+LIST *eq(LIST *x, LIST *y);
+LIST *atom(LIST *x);
+LIST *_and(LIST *x);
+LIST *_or(LIST *x);
+LIST *_not(LIST *x);
+LIST *_list(LIST *x);
+void var_to_user(LIST *p);
+void var_to_atom(LIST *p);
+void find_labels(LIST *p);
+
+void work_garbageCollect(LIST *);   // for work
+void marktree(LIST *p);
+void *emalloc(size_t size);
+
+void load_library();
+int isfunc(int t);
+void debug(LIST *p);
+void debug2(LIST *p);
+
+#endif