Lisp Interpreter for mbed LPC1768
Lisp Interpreter
(Marc Adler Lisp Interpreter, malisp)
mbed LPC1768 port by Takehisa Oneta (ohneta@gmail.com)
Diff: malisp.h
- 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