#ifndef _VA_H #define _VA_H #include #include #include #include #include typedef enum { INT_T, NUM_T, STR_T, SYM_T, LIST_T, NIL_T, UNK_T } ValueType; typedef long Value; typedef Value (*_SNILAD)(void); typedef Value (*_SMONAD)(Value); typedef Value (*_SDYAD)(Value, Value); typedef Value (*_SMKNUM)(double); typedef double (*_SFROMNUM)(Value); typedef Value (*_SMKINT)(long); typedef long (*_SFROMINT)(Value); typedef Value (*_SMKSTR)(char *); typedef char *(*_SFROMSTR)(Value); typedef ValueType (*_STYPEOF)(Value); typedef size_t (*_SLENOF)(Value); typedef void (*_SFAIL)(char *); _SDYAD mkpair; _SMONAD head; _SMONAD tail; _SMKNUM mknum; _SFROMNUM fromnum; _SMKINT mkint; _SFROMINT fromint; _SMKSTR mkstr; _SFROMSTR fromstr; _SMKSTR mksym; _SFROMSTR fromsym; _SNILAD mklist; _STYPEOF type; _SLENOF lenof; _SFAIL fail; Value EmptyList; Value Nil; int va_vn; char *va_v; char *va_b; #define ERROR(m) \ do { \ fail(m); \ return Nil; \ } while (0) #define FIRST(x) head(x) #define SECOND(x) head(tail(x)) #define THIRD(x) head(tail(tail(x))) void VA__SYNC(ex_mkpair, ex_head, ex_tail, ex_mknum, ex_fromnum, ex_mkint, ex_fromint, ex_mkstr, ex_fromstr, ex_mksym, ex_fromsym, ex_mklist, ex_typeof, ex_lenof, ex_fail, ex_nil, ex_va_vn, ex_va_v, ex_va_b) _SDYAD ex_mkpair; _SMONAD ex_head; _SMONAD ex_tail; _SMKNUM ex_mknum; _SFROMNUM ex_fromnum; _SMKINT ex_mkint; _SFROMINT ex_fromint; _SMKSTR ex_mkstr; _SFROMSTR ex_fromstr; _SMKSTR ex_mksym; _SFROMSTR ex_fromsym; _SNILAD ex_mklist; _STYPEOF ex_typeof; _SLENOF ex_lenof; _SFAIL ex_fail; Value ex_nil; int ex_va_vn; char *ex_va_v; char *ex_va_b; { mkpair = ex_mkpair; head = ex_head; tail = ex_tail; mknum = ex_mknum; fromnum = ex_fromnum; mkint = ex_mkint; fromint = ex_fromint; mkstr = ex_mkstr; fromstr = ex_fromstr; mksym = ex_mksym; fromsym = ex_fromsym; mklist = ex_mklist; EmptyList = mklist(); type = ex_typeof; lenof = ex_lenof; fail = ex_fail; Nil = ex_nil; va_vn = ex_va_vn; va_v = ex_va_v; va_b = ex_va_b; } #endif