Lisp Interpreter for mbed LPC1768

Dependencies:   mbed

Lisp Interpreter

(Marc Adler Lisp Interpreter, malisp)

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

Committer:
ohneta
Date:
Sun Apr 17 11:59:13 2016 +0000
Revision:
0:e9a7a38d9ad3
Child:
1:a2955606adef
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 0:e9a7a38d9ad3 1 /**
ohneta 0:e9a7a38d9ad3 2 *
ohneta 0:e9a7a38d9ad3 3 */
ohneta 0:e9a7a38d9ad3 4
ohneta 0:e9a7a38d9ad3 5 #ifndef MALISP_H
ohneta 0:e9a7a38d9ad3 6 #define MALISP_H
ohneta 0:e9a7a38d9ad3 7
ohneta 0:e9a7a38d9ad3 8
ohneta 0:e9a7a38d9ad3 9 #define FALSE 0
ohneta 0:e9a7a38d9ad3 10 #define TRUE 1
ohneta 0:e9a7a38d9ad3 11
ohneta 0:e9a7a38d9ad3 12 // input types
ohneta 0:e9a7a38d9ad3 13 #define INQUOTE 1
ohneta 0:e9a7a38d9ad3 14 #define LPAREN 2
ohneta 0:e9a7a38d9ad3 15 #define RPAREN 3
ohneta 0:e9a7a38d9ad3 16 #define LETTER 4
ohneta 0:e9a7a38d9ad3 17 #define DIGIT 5
ohneta 0:e9a7a38d9ad3 18
ohneta 0:e9a7a38d9ad3 19
ohneta 0:e9a7a38d9ad3 20 // token types
ohneta 0:e9a7a38d9ad3 21 #define IATOM 6
ohneta 0:e9a7a38d9ad3 22 #define RATOM 7
ohneta 0:e9a7a38d9ad3 23 #define SATOM 8
ohneta 0:e9a7a38d9ad3 24 #define FUNC 9
ohneta 0:e9a7a38d9ad3 25 #define LST 10
ohneta 0:e9a7a38d9ad3 26 #define VARI 11
ohneta 0:e9a7a38d9ad3 27 #define QUOTE 12
ohneta 0:e9a7a38d9ad3 28 #define NILL 13
ohneta 0:e9a7a38d9ad3 29 #define T 14
ohneta 0:e9a7a38d9ad3 30 #define COND 15
ohneta 0:e9a7a38d9ad3 31 #define DEFUN 16
ohneta 0:e9a7a38d9ad3 32 #define FCAR 17
ohneta 0:e9a7a38d9ad3 33 #define FCDR 18
ohneta 0:e9a7a38d9ad3 34 #define FCONS 19
ohneta 0:e9a7a38d9ad3 35 #define FEQ 20
ohneta 0:e9a7a38d9ad3 36 #define FATOM 21
ohneta 0:e9a7a38d9ad3 37 #define FQUOTE 22
ohneta 0:e9a7a38d9ad3 38 #define FSETQ 23
ohneta 0:e9a7a38d9ad3 39 #define FUSER 24
ohneta 0:e9a7a38d9ad3 40 #define PLUS 25
ohneta 0:e9a7a38d9ad3 41 #define DIFF 26
ohneta 0:e9a7a38d9ad3 42 #define TIMES 27
ohneta 0:e9a7a38d9ad3 43 #define QUOTIENT 28
ohneta 0:e9a7a38d9ad3 44 #define ADD1 29
ohneta 0:e9a7a38d9ad3 45 #define SUB1 30
ohneta 0:e9a7a38d9ad3 46 #define ZEROP 31
ohneta 0:e9a7a38d9ad3 47 #define NUMBERP 32
ohneta 0:e9a7a38d9ad3 48 #define GREATERP 33
ohneta 0:e9a7a38d9ad3 49 #define LESSP 34
ohneta 0:e9a7a38d9ad3 50 #define PRINT 35
ohneta 0:e9a7a38d9ad3 51 #define NUL 36
ohneta 0:e9a7a38d9ad3 52 #define FUNCALL 37
ohneta 0:e9a7a38d9ad3 53 #define PROG 38
ohneta 0:e9a7a38d9ad3 54 #define GO 39
ohneta 0:e9a7a38d9ad3 55 #define RETRN 40
ohneta 0:e9a7a38d9ad3 56 #define LABL 41
ohneta 0:e9a7a38d9ad3 57 #define FREAD 42
ohneta 0:e9a7a38d9ad3 58 #define FREPLACA 43
ohneta 0:e9a7a38d9ad3 59 #define FREPLACD 44
ohneta 0:e9a7a38d9ad3 60 #define FEVAL 45
ohneta 0:e9a7a38d9ad3 61 #define FAPPLY 46
ohneta 0:e9a7a38d9ad3 62
ohneta 0:e9a7a38d9ad3 63 /*
ohneta 0:e9a7a38d9ad3 64 // for garbage collection
ohneta 0:e9a7a38d9ad3 65 #define GARBAGE 47
ohneta 0:e9a7a38d9ad3 66 #define USED 48
ohneta 0:e9a7a38d9ad3 67 #define RUNNING 49
ohneta 0:e9a7a38d9ad3 68 */
ohneta 0:e9a7a38d9ad3 69 #define GARBAGE 0
ohneta 0:e9a7a38d9ad3 70 #define USED 1
ohneta 0:e9a7a38d9ad3 71 #define RUNNING 2
ohneta 0:e9a7a38d9ad3 72
ohneta 0:e9a7a38d9ad3 73
ohneta 0:e9a7a38d9ad3 74 // more primitives
ohneta 0:e9a7a38d9ad3 75 #define FAND 50
ohneta 0:e9a7a38d9ad3 76 #define FOR 51
ohneta 0:e9a7a38d9ad3 77 #define FNOT 52
ohneta 0:e9a7a38d9ad3 78 #define FLIST 53
ohneta 0:e9a7a38d9ad3 79
ohneta 0:e9a7a38d9ad3 80 #define ERR -2
ohneta 0:e9a7a38d9ad3 81
ohneta 0:e9a7a38d9ad3 82 // mbed extpand functions
ohneta 0:e9a7a38d9ad3 83 #define FINFO 55
ohneta 0:e9a7a38d9ad3 84 #define FFREEMEM 59
ohneta 0:e9a7a38d9ad3 85 #define FWAIT 60
ohneta 0:e9a7a38d9ad3 86 #define FDOUT 61
ohneta 0:e9a7a38d9ad3 87 #define FDIN 62
ohneta 0:e9a7a38d9ad3 88 #define FAOUT 63
ohneta 0:e9a7a38d9ad3 89 #define FAIN 64
ohneta 0:e9a7a38d9ad3 90 #define PWMOUT 65
ohneta 0:e9a7a38d9ad3 91
ohneta 0:e9a7a38d9ad3 92
ohneta 0:e9a7a38d9ad3 93 typedef struct LIST {
ohneta 0:e9a7a38d9ad3 94 //uint32_t cons_num;
ohneta 0:e9a7a38d9ad3 95
ohneta 0:e9a7a38d9ad3 96 //char gcbit;
ohneta 0:e9a7a38d9ad3 97 uint32_t gcbit;
ohneta 0:e9a7a38d9ad3 98 int32_t htype;
ohneta 0:e9a7a38d9ad3 99 union {
ohneta 0:e9a7a38d9ad3 100 float num;
ohneta 0:e9a7a38d9ad3 101 char *pname;
ohneta 0:e9a7a38d9ad3 102 } u;
ohneta 0:e9a7a38d9ad3 103 struct LIST *left;
ohneta 0:e9a7a38d9ad3 104 struct LIST *right;
ohneta 0:e9a7a38d9ad3 105 } LIST;
ohneta 0:e9a7a38d9ad3 106
ohneta 0:e9a7a38d9ad3 107
ohneta 0:e9a7a38d9ad3 108
ohneta 0:e9a7a38d9ad3 109 #define FILE_MINE int32_t
ohneta 0:e9a7a38d9ad3 110 #define FILE_SERIAL 2
ohneta 0:e9a7a38d9ad3 111 #define FILE_STRING 3
ohneta 0:e9a7a38d9ad3 112
ohneta 0:e9a7a38d9ad3 113
ohneta 0:e9a7a38d9ad3 114
ohneta 0:e9a7a38d9ad3 115 // Prototypes
ohneta 0:e9a7a38d9ad3 116 int getc_mine(FILE_MINE fd);
ohneta 0:e9a7a38d9ad3 117 void ungetc_mine(int c, FILE_MINE fd);
ohneta 0:e9a7a38d9ad3 118
ohneta 0:e9a7a38d9ad3 119 size_t _getFreeMemorySize();
ohneta 0:e9a7a38d9ad3 120 LIST *memfreesize();
ohneta 0:e9a7a38d9ad3 121
ohneta 0:e9a7a38d9ad3 122
ohneta 0:e9a7a38d9ad3 123 void malisp_main();
ohneta 0:e9a7a38d9ad3 124 void interpret_malisp();
ohneta 0:e9a7a38d9ad3 125
ohneta 0:e9a7a38d9ad3 126 void initialize();
ohneta 0:e9a7a38d9ad3 127 LIST *init(char *name, int t);
ohneta 0:e9a7a38d9ad3 128 LIST *makelist();
ohneta 0:e9a7a38d9ad3 129 void lisp_print(LIST *p);
ohneta 0:e9a7a38d9ad3 130 LIST *eval(LIST *x, LIST *alist);
ohneta 0:e9a7a38d9ad3 131 LIST *evalcond(LIST *expr, LIST *alist);
ohneta 0:e9a7a38d9ad3 132 LIST *evalprog(LIST *p, LIST *alist);
ohneta 0:e9a7a38d9ad3 133 LIST *pairargs(LIST *params, LIST *args, LIST *alist, int prog);
ohneta 0:e9a7a38d9ad3 134 LIST *evalargs(LIST *arglist, LIST *alist);
ohneta 0:e9a7a38d9ad3 135 LIST *assoc( LIST *alist, char *name);
ohneta 0:e9a7a38d9ad3 136 LIST *getvar(LIST *alist, char *name);
ohneta 0:e9a7a38d9ad3 137 LIST *arith(LIST *op, LIST *x, LIST *y);
ohneta 0:e9a7a38d9ad3 138 int advance();
ohneta 0:e9a7a38d9ad3 139 LIST *lookup(LIST *head, char *name);
ohneta 0:e9a7a38d9ad3 140 //LIST *install(char *name);
ohneta 0:e9a7a38d9ad3 141 LIST *install(char *name, int nameConstKind);
ohneta 0:e9a7a38d9ad3 142
ohneta 0:e9a7a38d9ad3 143 LIST *getnum();
ohneta 0:e9a7a38d9ad3 144 LIST *getid();
ohneta 0:e9a7a38d9ad3 145 int gettok();
ohneta 0:e9a7a38d9ad3 146 LIST *new_malisp();
ohneta 0:e9a7a38d9ad3 147 int type(LIST *p);
ohneta 0:e9a7a38d9ad3 148 char* getname(LIST *p);
ohneta 0:e9a7a38d9ad3 149 void rplaca(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 150 void rplacd(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 151 void rplact( LIST *p, int t);
ohneta 0:e9a7a38d9ad3 152 LIST *car(LIST *p);
ohneta 0:e9a7a38d9ad3 153 LIST *cdr(LIST *p);
ohneta 0:e9a7a38d9ad3 154 LIST *cons(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 155 LIST *eq(LIST *x, LIST *y);
ohneta 0:e9a7a38d9ad3 156 LIST *atom(LIST *x);
ohneta 0:e9a7a38d9ad3 157 LIST *_and(LIST *x);
ohneta 0:e9a7a38d9ad3 158 LIST *_or(LIST *x);
ohneta 0:e9a7a38d9ad3 159 LIST *_not(LIST *x);
ohneta 0:e9a7a38d9ad3 160 LIST *_list(LIST *x);
ohneta 0:e9a7a38d9ad3 161 void var_to_user(LIST *p);
ohneta 0:e9a7a38d9ad3 162 void var_to_atom(LIST *p);
ohneta 0:e9a7a38d9ad3 163 void find_labels(LIST *p);
ohneta 0:e9a7a38d9ad3 164
ohneta 0:e9a7a38d9ad3 165 void work_garbageCollect(LIST *); // for work
ohneta 0:e9a7a38d9ad3 166 void marktree(LIST *p);
ohneta 0:e9a7a38d9ad3 167 void *emalloc(size_t size);
ohneta 0:e9a7a38d9ad3 168
ohneta 0:e9a7a38d9ad3 169 void load_library();
ohneta 0:e9a7a38d9ad3 170 int isfunc(int t);
ohneta 0:e9a7a38d9ad3 171 void debug(LIST *p);
ohneta 0:e9a7a38d9ad3 172 void debug2(LIST *p);
ohneta 0:e9a7a38d9ad3 173
ohneta 0:e9a7a38d9ad3 174 #endif