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:
Sat May 21 22:26:40 2016 +0000
Revision:
1:a2955606adef
Parent:
0:e9a7a38d9ad3
??commit

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 1:a2955606adef 21 #define IATOM 6 // 整数ATOM
ohneta 1:a2955606adef 22 #define RATOM 7 // 実数ATOM (float)
ohneta 1:a2955606adef 23 #define SATOM 8 // 文字列ATOM
ohneta 1:a2955606adef 24 #define FUNC 9 // 関数
ohneta 1:a2955606adef 25 #define LST 10 // リスト
ohneta 1:a2955606adef 26 #define VARI 11 // 変数
ohneta 1:a2955606adef 27 #define QUOTE 12 // クオート
ohneta 1:a2955606adef 28 #define NILL 13 // nil
ohneta 1:a2955606adef 29 #define T 14 // t
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 1:a2955606adef 94
ohneta 1:a2955606adef 95 uint32_t gcbit;
ohneta 1:a2955606adef 96
ohneta 1:a2955606adef 97 int32_t htype;
ohneta 1:a2955606adef 98 union {
ohneta 1:a2955606adef 99 float num;
ohneta 1:a2955606adef 100 char *pname;
ohneta 1:a2955606adef 101 } u;
ohneta 1:a2955606adef 102 struct LIST *left;
ohneta 1:a2955606adef 103 struct LIST *right;
ohneta 0:e9a7a38d9ad3 104 } LIST;
ohneta 0:e9a7a38d9ad3 105
ohneta 0:e9a7a38d9ad3 106
ohneta 0:e9a7a38d9ad3 107
ohneta 0:e9a7a38d9ad3 108 #define FILE_MINE int32_t
ohneta 0:e9a7a38d9ad3 109 #define FILE_SERIAL 2
ohneta 0:e9a7a38d9ad3 110 #define FILE_STRING 3
ohneta 0:e9a7a38d9ad3 111
ohneta 0:e9a7a38d9ad3 112
ohneta 0:e9a7a38d9ad3 113
ohneta 0:e9a7a38d9ad3 114 // Prototypes
ohneta 0:e9a7a38d9ad3 115 int getc_mine(FILE_MINE fd);
ohneta 0:e9a7a38d9ad3 116 void ungetc_mine(int c, FILE_MINE fd);
ohneta 0:e9a7a38d9ad3 117
ohneta 0:e9a7a38d9ad3 118 size_t _getFreeMemorySize();
ohneta 0:e9a7a38d9ad3 119 LIST *memfreesize();
ohneta 0:e9a7a38d9ad3 120
ohneta 0:e9a7a38d9ad3 121
ohneta 0:e9a7a38d9ad3 122 void malisp_main();
ohneta 0:e9a7a38d9ad3 123 void interpret_malisp();
ohneta 0:e9a7a38d9ad3 124
ohneta 0:e9a7a38d9ad3 125 void initialize();
ohneta 0:e9a7a38d9ad3 126 LIST *init(char *name, int t);
ohneta 1:a2955606adef 127
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 1:a2955606adef 141 //LIST *install(char *name, int nameConstKind);
ohneta 1:a2955606adef 142 LIST *install(char *name, bool nameCopyFlag);
ohneta 0:e9a7a38d9ad3 143
ohneta 0:e9a7a38d9ad3 144 LIST *getnum();
ohneta 0:e9a7a38d9ad3 145 LIST *getid();
ohneta 0:e9a7a38d9ad3 146 int gettok();
ohneta 0:e9a7a38d9ad3 147 LIST *new_malisp();
ohneta 0:e9a7a38d9ad3 148 int type(LIST *p);
ohneta 0:e9a7a38d9ad3 149 char* getname(LIST *p);
ohneta 0:e9a7a38d9ad3 150 void rplaca(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 151 void rplacd(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 152 void rplact( LIST *p, int t);
ohneta 0:e9a7a38d9ad3 153 LIST *car(LIST *p);
ohneta 0:e9a7a38d9ad3 154 LIST *cdr(LIST *p);
ohneta 0:e9a7a38d9ad3 155 LIST *cons(LIST *p, LIST *q);
ohneta 0:e9a7a38d9ad3 156 LIST *eq(LIST *x, LIST *y);
ohneta 0:e9a7a38d9ad3 157 LIST *atom(LIST *x);
ohneta 0:e9a7a38d9ad3 158 LIST *_and(LIST *x);
ohneta 0:e9a7a38d9ad3 159 LIST *_or(LIST *x);
ohneta 0:e9a7a38d9ad3 160 LIST *_not(LIST *x);
ohneta 0:e9a7a38d9ad3 161 LIST *_list(LIST *x);
ohneta 0:e9a7a38d9ad3 162 void var_to_user(LIST *p);
ohneta 0:e9a7a38d9ad3 163 void var_to_atom(LIST *p);
ohneta 0:e9a7a38d9ad3 164 void find_labels(LIST *p);
ohneta 0:e9a7a38d9ad3 165
ohneta 0:e9a7a38d9ad3 166 void work_garbageCollect(LIST *); // for work
ohneta 0:e9a7a38d9ad3 167 void marktree(LIST *p);
ohneta 0:e9a7a38d9ad3 168 void *emalloc(size_t size);
ohneta 0:e9a7a38d9ad3 169
ohneta 0:e9a7a38d9ad3 170 void load_library();
ohneta 0:e9a7a38d9ad3 171 int isfunc(int t);
ohneta 0:e9a7a38d9ad3 172 void debug(LIST *p);
ohneta 0:e9a7a38d9ad3 173 void debug2(LIST *p);
ohneta 0:e9a7a38d9ad3 174
ohneta 0:e9a7a38d9ad3 175 #endif