Lisp Interpreter for mbed LPC1768
Lisp Interpreter
(Marc Adler Lisp Interpreter, malisp)
mbed LPC1768 port by Takehisa Oneta (ohneta@gmail.com)
malisp.h@0:e9a7a38d9ad3, 2016-04-17 (annotated)
- Committer:
- ohneta
- Date:
- Sun Apr 17 11:59:13 2016 +0000
- Revision:
- 0:e9a7a38d9ad3
- Child:
- 1:a2955606adef
???????????
Who changed what in which revision?
User | Revision | Line number | New 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 |