diff --git a/ase/lsp/init.c b/ase/lsp/init.c index 7cb562b3..9e28792f 100644 --- a/ase/lsp/init.c +++ b/ase/lsp/init.c @@ -1,11 +1,14 @@ /* - * $Id: init.c,v 1.7 2005-09-20 09:17:06 bacon Exp $ + * $Id: init.c,v 1.8 2005-09-20 11:19:15 bacon Exp $ */ #include +#include #include #include +static int __add_builtin_prims (xp_lsp_t* lsp); + xp_lsp_t* xp_lsp_open (xp_lsp_t* lsp, xp_size_t mem_ubound, xp_size_t mem_ubound_inc) { @@ -38,7 +41,7 @@ xp_lsp_t* xp_lsp_open (xp_lsp_t* lsp, return XP_NULL; } - if (xp_lsp_add_builtin_prims (lsp->mem) == -1) { + if (__add_builtin_prims(lsp) == -1) { xp_lsp_mem_free (lsp->mem); xp_lsp_token_close (&lsp->token); if (lsp->__malloced) xp_free (lsp); @@ -119,3 +122,39 @@ int xp_lsp_detach_output (xp_lsp_t* lsp) return 0; } + +static int __add_builtin_prims (xp_lsp_t* lsp) +{ + +#define ADD_PRIM(mem,name,prim) \ + if (xp_lsp_add_prim(mem,name,prim) == -1) return -1; + + ADD_PRIM (lsp, XP_TEXT("abort"), xp_lsp_prim_abort); + ADD_PRIM (lsp, XP_TEXT("eval"), xp_lsp_prim_eval); + ADD_PRIM (lsp, XP_TEXT("prog1"), xp_lsp_prim_prog1); + ADD_PRIM (lsp, XP_TEXT("progn"), xp_lsp_prim_progn); + ADD_PRIM (lsp, XP_TEXT("gc"), xp_lsp_prim_gc); + + ADD_PRIM (lsp, XP_TEXT("cond"), xp_lsp_prim_cond); + ADD_PRIM (lsp, XP_TEXT("if"), xp_lsp_prim_if); + ADD_PRIM (lsp, XP_TEXT("while"), xp_lsp_prim_while); + + ADD_PRIM (lsp, XP_TEXT("car"), xp_lsp_prim_car); + ADD_PRIM (lsp, XP_TEXT("cdr"), xp_lsp_prim_cdr); + ADD_PRIM (lsp, XP_TEXT("cons"), xp_lsp_prim_cons); + ADD_PRIM (lsp, XP_TEXT("set"), xp_lsp_prim_set); + ADD_PRIM (lsp, XP_TEXT("setq"), xp_lsp_prim_setq); + ADD_PRIM (lsp, XP_TEXT("quote"), xp_lsp_prim_quote); + ADD_PRIM (lsp, XP_TEXT("defun"), xp_lsp_prim_defun); + ADD_PRIM (lsp, XP_TEXT("demac"), xp_lsp_prim_demac); + ADD_PRIM (lsp, XP_TEXT("let"), xp_lsp_prim_let); + ADD_PRIM (lsp, XP_TEXT("let*"), xp_lsp_prim_letx); + + ADD_PRIM (lsp, XP_TEXT(">"), xp_lsp_prim_gt); + ADD_PRIM (lsp, XP_TEXT("<"), xp_lsp_prim_lt); + + ADD_PRIM (lsp, XP_TEXT("+"), xp_lsp_prim_plus); + ADD_PRIM (lsp, XP_TEXT("-"), xp_lsp_prim_minus); + + return 0; +} diff --git a/ase/lsp/mem.c b/ase/lsp/mem.c index 4b72ed86..fb0600a8 100644 --- a/ase/lsp/mem.c +++ b/ase/lsp/mem.c @@ -1,13 +1,13 @@ /* - * $Id: mem.c,v 1.5 2005-09-20 09:17:06 bacon Exp $ + * $Id: mem.c,v 1.6 2005-09-20 11:19:15 bacon Exp $ */ #include #include #include +#include #include -#include xp_lsp_mem_t* xp_lsp_mem_new (xp_size_t ubound, xp_size_t ubound_inc) { @@ -56,9 +56,9 @@ xp_lsp_mem_t* xp_lsp_mem_new (xp_size_t ubound, xp_size_t ubound_inc) // initialize common object pointers mem->nil = xp_lsp_make_nil (mem); mem->t = xp_lsp_make_true (mem); - mem->quote = xp_lsp_make_symbol (mem, XP_TEXT("quote"), 5); - mem->lambda = xp_lsp_make_symbol (mem, XP_TEXT("lambda"), 6); - mem->macro = xp_lsp_make_symbol (mem, XP_TEXT("macro"), 5); + mem->quote = xp_lsp_make_symbol (mem, XP_TEXT("quote")); + mem->lambda = xp_lsp_make_symbol (mem, XP_TEXT("lambda")); + mem->macro = xp_lsp_make_symbol (mem, XP_TEXT("macro")); if (mem->nil == XP_NULL || mem->t == XP_NULL || @@ -93,11 +93,11 @@ void xp_lsp_mem_free (xp_lsp_mem_t* mem) } static int __add_prim (xp_lsp_mem_t* mem, - const xp_char_t* name, xp_size_t len, xp_lsp_pimpl_t prim) + const xp_char_t* name, xp_size_t len, xp_lsp_prim_t prim) { xp_lsp_obj_t* n, * p; - n = xp_lsp_make_symbol (mem, name, len); + n = xp_lsp_make_symbolx (mem, name, len); if (n == XP_NULL) return -1; xp_lsp_lock (n); @@ -199,7 +199,9 @@ void xp_lsp_dispose (xp_lsp_mem_t* mem, xp_lsp_obj_t* prev, xp_lsp_obj_t* obj) else XP_LSP_LINK(prev) = XP_LSP_LINK(obj); mem->count--; +#if 0 xp_dprint1 (XP_TEXT("mem->count: %u\n"), mem->count); +#endif xp_free (obj); } @@ -287,21 +289,30 @@ static void xp_lsp_mark (xp_lsp_mem_t* mem) xp_lsp_array_t* array; xp_size_t i; +#if 0 xp_dprint0 (XP_TEXT("marking environment frames\n")); +#endif // mark objects in the environment frames frame = mem->frame; while (frame != XP_NULL) { assoc = frame->assoc; while (assoc != XP_NULL) { xp_lsp_mark_obj (assoc->name); - xp_lsp_mark_obj (assoc->value); + + if (assoc->value != XP_NULL) + xp_lsp_mark_obj (assoc->value); + if (assoc->func != XP_NULL) + xp_lsp_mark_obj (assoc->func); + assoc = assoc->link; } frame = frame->link; } +#if 0 xp_dprint0 (XP_TEXT("marking interim frames\n")); +#endif // mark objects in the interim frames frame = mem->brooding_frame; @@ -310,7 +321,12 @@ static void xp_lsp_mark (xp_lsp_mem_t* mem) assoc = frame->assoc; while (assoc != XP_NULL) { xp_lsp_mark_obj (assoc->name); - xp_lsp_mark_obj (assoc->value); + + if (assoc->value != XP_NULL) + xp_lsp_mark_obj (assoc->value); + if (assoc->func != XP_NULL) + xp_lsp_mark_obj (assoc->func); + assoc = assoc->link; } @@ -322,13 +338,17 @@ static void xp_lsp_mark (xp_lsp_mem_t* mem) if (mem->locked != XP_NULL) xp_lsp_mark_obj (mem->locked); */ +#if 0 xp_dprint0 (XP_TEXT("marking termporary objects\n")); +#endif array = mem->temp_array; for (i = 0; i < array->size; i++) { xp_lsp_mark_obj (array->buffer[i]); } +#if 0 xp_dprint0 (XP_TEXT("marking builtin objects\n")); +#endif // mark common objects if (mem->t != XP_NULL) xp_lsp_mark_obj (mem->t); if (mem->nil != XP_NULL) xp_lsp_mark_obj (mem->nil); @@ -349,7 +369,9 @@ static void xp_lsp_sweep (xp_lsp_mem_t* mem) obj = mem->used[i]; //obj = mem->used[--i]; +#if 0 xp_dprint1 (XP_TEXT("sweeping objects of type: %u\n"), i); +#endif while (obj != XP_NULL) { next = XP_LSP_LINK(obj); @@ -393,7 +415,8 @@ xp_lsp_obj_t* xp_lsp_make_int (xp_lsp_mem_t* mem, xp_lsp_int_t value) { xp_lsp_obj_t* obj; - obj = xp_lsp_alloc (mem, XP_LSP_OBJ_INT, xp_sizeof(xp_lsp_obj_int_t)); + obj = xp_lsp_alloc (mem, + XP_LSP_OBJ_INT, xp_sizeof(xp_lsp_obj_int_t)); if (obj == XP_NULL) return XP_NULL; XP_LSP_IVALUE(obj) = value; @@ -401,19 +424,25 @@ xp_lsp_obj_t* xp_lsp_make_int (xp_lsp_mem_t* mem, xp_lsp_int_t value) return obj; } -xp_lsp_obj_t* xp_lsp_make_float (xp_lsp_mem_t* mem, xp_lsp_real_t value) +xp_lsp_obj_t* xp_lsp_make_real (xp_lsp_mem_t* mem, xp_lsp_real_t value) { xp_lsp_obj_t* obj; - obj = xp_lsp_alloc (mem, XP_LSP_OBJ_FLOAT, xp_sizeof(xp_lsp_obj_float_t)); + obj = xp_lsp_alloc (mem, + XP_LSP_OBJ_REAL, xp_sizeof(xp_lsp_obj_real_t)); if (obj == XP_NULL) return XP_NULL; - XP_LSP_FVALUE(obj) = value; + XP_LSP_RVALUE(obj) = value; return obj; } -xp_lsp_obj_t* xp_lsp_make_symbol ( +xp_lsp_obj_t* xp_lsp_make_symbol (xp_lsp_mem_t* mem, const xp_char_t* str) +{ + return xp_lsp_make_symbolx (mem, str, xp_strlen(str)); +} + +xp_lsp_obj_t* xp_lsp_make_symbolx ( xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len) { xp_lsp_obj_t* obj; @@ -437,7 +466,13 @@ xp_lsp_obj_t* xp_lsp_make_symbol ( return obj; } -xp_lsp_obj_t* xp_lsp_make_string (xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len) +xp_lsp_obj_t* xp_lsp_make_string (xp_lsp_mem_t* mem, const xp_char_t* str) +{ + return xp_lsp_make_stringx (mem, str, xp_strlen(str)); +} + +xp_lsp_obj_t* xp_lsp_make_stringx ( + xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len) { xp_lsp_obj_t* obj; @@ -452,7 +487,8 @@ xp_lsp_obj_t* xp_lsp_make_string (xp_lsp_mem_t* mem, const xp_char_t* str, xp_si return obj; } -xp_lsp_obj_t* xp_lsp_make_cons (xp_lsp_mem_t* mem, xp_lsp_obj_t* car, xp_lsp_obj_t* cdr) +xp_lsp_obj_t* xp_lsp_make_cons ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* car, xp_lsp_obj_t* cdr) { xp_lsp_obj_t* obj; @@ -465,7 +501,8 @@ xp_lsp_obj_t* xp_lsp_make_cons (xp_lsp_mem_t* mem, xp_lsp_obj_t* car, xp_lsp_obj return obj; } -xp_lsp_obj_t* xp_lsp_make_func (xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body) +xp_lsp_obj_t* xp_lsp_make_func ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body) { xp_lsp_obj_t* obj; @@ -478,7 +515,8 @@ xp_lsp_obj_t* xp_lsp_make_func (xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_ return obj; } -xp_lsp_obj_t* xp_lsp_make_macro (xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body) +xp_lsp_obj_t* xp_lsp_make_macro ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body) { xp_lsp_obj_t* obj; diff --git a/ase/lsp/mem.h b/ase/lsp/mem.h index f827e699..4284c847 100644 --- a/ase/lsp/mem.h +++ b/ase/lsp/mem.h @@ -1,5 +1,5 @@ /* - * $Id: mem.h,v 1.5 2005-09-20 09:17:06 bacon Exp $ + * $Id: mem.h,v 1.6 2005-09-20 11:19:15 bacon Exp $ */ #ifndef _XP_LSP_MEM_H_ @@ -69,13 +69,24 @@ void xp_lsp_unlock_all (xp_lsp_obj_t* obj); xp_lsp_obj_t* xp_lsp_make_nil (xp_lsp_mem_t* mem); xp_lsp_obj_t* xp_lsp_make_true (xp_lsp_mem_t* mem); xp_lsp_obj_t* xp_lsp_make_int (xp_lsp_mem_t* mem, xp_lsp_int_t value); -xp_lsp_obj_t* xp_lsp_make_float (xp_lsp_mem_t* mem, xp_lsp_real_t value); -xp_lsp_obj_t* xp_lsp_make_symbol (xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len); -xp_lsp_obj_t* xp_lsp_make_string (xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len); -xp_lsp_obj_t* xp_lsp_make_cons (xp_lsp_mem_t* mem, xp_lsp_obj_t* car, xp_lsp_obj_t* cdr); -xp_lsp_obj_t* xp_lsp_make_func (xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body); -xp_lsp_obj_t* xp_lsp_make_macro (xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body); -xp_lsp_obj_t* xp_lsp_make_prim (xp_lsp_mem_t* mem, void* impl); +xp_lsp_obj_t* xp_lsp_make_real (xp_lsp_mem_t* mem, xp_lsp_real_t value); + +xp_lsp_obj_t* xp_lsp_make_symbol ( + xp_lsp_mem_t* mem, const xp_char_t* str); +xp_lsp_obj_t* xp_lsp_make_symbolx ( + xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len); +xp_lsp_obj_t* xp_lsp_make_string ( + xp_lsp_mem_t* mem, const xp_char_t* str); +xp_lsp_obj_t* xp_lsp_make_stringx ( + xp_lsp_mem_t* mem, const xp_char_t* str, xp_size_t len); +xp_lsp_obj_t* xp_lsp_make_cons ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* car, xp_lsp_obj_t* cdr); +xp_lsp_obj_t* xp_lsp_make_func ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body); +xp_lsp_obj_t* xp_lsp_make_macro ( + xp_lsp_mem_t* mem, xp_lsp_obj_t* formal, xp_lsp_obj_t* body); + +xp_lsp_obj_t* xp_lsp_make_prim (xp_lsp_mem_t* mem, void* impl); // frame lookup xp_lsp_assoc_t* xp_lsp_lookup (xp_lsp_mem_t* mem, xp_lsp_obj_t* name); diff --git a/ase/lsp/obj.h b/ase/lsp/obj.h index 46d5050d..72c332f2 100644 --- a/ase/lsp/obj.h +++ b/ase/lsp/obj.h @@ -1,5 +1,5 @@ /* - * $Id: obj.h,v 1.1 2005-09-18 11:54:23 bacon Exp $ + * $Id: obj.h,v 1.2 2005-09-20 11:19:15 bacon Exp $ */ #ifndef _XP_LSP_OBJ_H_ @@ -13,7 +13,7 @@ enum XP_LSP_OBJ_NIL = 0, XP_LSP_OBJ_TRUE, XP_LSP_OBJ_INT, - XP_LSP_OBJ_FLOAT, + XP_LSP_OBJ_REAL, XP_LSP_OBJ_SYMBOL, XP_LSP_OBJ_STRING, XP_LSP_OBJ_CONS, @@ -52,7 +52,7 @@ struct xp_lsp_obj_int_t xp_lsp_int_t value; }; -struct xp_lsp_obj_float_t +struct xp_lsp_obj_real_t { XP_LSP_OBJ_HEADER; xp_lsp_real_t value; @@ -107,7 +107,7 @@ typedef struct xp_lsp_obj_t xp_lsp_obj_t; typedef struct xp_lsp_obj_nil_t xp_lsp_obj_nil_t; typedef struct xp_lsp_obj_true_t xp_lsp_obj_true_t; typedef struct xp_lsp_obj_int_t xp_lsp_obj_int_t; -typedef struct xp_lsp_obj_float_t xp_lsp_obj_float_t; +typedef struct xp_lsp_obj_real_t xp_lsp_obj_real_t; typedef struct xp_lsp_obj_symbol_t xp_lsp_obj_symbol_t; typedef struct xp_lsp_obj_string_t xp_lsp_obj_string_t; typedef struct xp_lsp_obj_cons_t xp_lsp_obj_cons_t; @@ -124,7 +124,7 @@ typedef struct xp_lsp_obj_prim_t xp_lsp_obj_prim_t; // value access #define XP_LSP_IVALUE(x) (((xp_lsp_obj_int_t*)x)->value) -#define XP_LSP_FVALUE(x) (((xp_lsp_obj_float_t*)x)->value) +#define XP_LSP_RVALUE(x) (((xp_lsp_obj_real_t*)x)->value) #ifdef __BORLANDC__ #define XP_LSP_SYMVALUE(x) ((xp_char_t*)(((xp_lsp_obj_symbol_t*)x) + 1)) @@ -146,6 +146,6 @@ typedef struct xp_lsp_obj_prim_t xp_lsp_obj_prim_t; #define XP_LSP_FBODY(x) (((xp_lsp_obj_func_t*)x)->body) #define XP_LSP_MFORMAL(x) (((xp_lsp_obj_macro_t*)x)->formal) #define XP_LSP_MBODY(x) (((xp_lsp_obj_macro_t*)x)->body) -#define XP_LSP_PIMPL(x) ((xp_lsp_pimpl_t)(((xp_lsp_obj_prim_t*)x)->impl)) +#define XP_LSP_PIMPL(x) ((xp_lsp_prim_t)(((xp_lsp_obj_prim_t*)x)->impl)) #endif diff --git a/ase/lsp/prim.c b/ase/lsp/prim.c index a048e22d..411dcfe7 100644 --- a/ase/lsp/prim.c +++ b/ase/lsp/prim.c @@ -1,12 +1,51 @@ /* - * $Id: prim.c,v 1.5 2005-09-20 09:17:06 bacon Exp $ + * $Id: prim.c,v 1.6 2005-09-20 11:19:15 bacon Exp $ */ #include #include #include + +#include #include +static int __add_prim (xp_lsp_mem_t* mem, + const xp_char_t* name, xp_size_t len, xp_lsp_prim_t prim); + +int xp_lsp_add_prim ( + xp_lsp_t* lsp, const xp_char_t* name, xp_lsp_prim_t prim) +{ + return __add_prim (lsp->mem, name, xp_strlen(name), prim); +} + +int xp_lsp_remove_prim (xp_lsp_t* lsp, const xp_char_t* name) +{ + // TODO: + return -1; +} + +static int __add_prim (xp_lsp_mem_t* mem, + const xp_char_t* name, xp_size_t len, xp_lsp_prim_t prim) +{ + xp_lsp_obj_t* n, * p; + + n = xp_lsp_make_symbolx (mem, name, len); + if (n == XP_NULL) return -1; + + xp_lsp_lock (n); + + p = xp_lsp_make_prim (mem, prim); + if (p == XP_NULL) return -1; + + xp_lsp_unlock (n); + + if (xp_lsp_set_func(mem, n, p) == XP_NULL) return -1; + + return 0; +} + + + xp_lsp_obj_t* xp_lsp_prim_abort (xp_lsp_t* lsp, xp_lsp_obj_t* args) { XP_LSP_PRIM_CHECK_ARG_COUNT (lsp, args, 0, 0); @@ -378,20 +417,20 @@ xp_lsp_obj_t* xp_lsp_prim_gt (xp_lsp_t* lsp, xp_lsp_obj_t* args) if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_INT) { res = XP_LSP_IVALUE(p1) > XP_LSP_IVALUE(p2); } - else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_FLOAT) { - res = XP_LSP_IVALUE(p1) > XP_LSP_FVALUE(p2); + else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_REAL) { + res = XP_LSP_IVALUE(p1) > XP_LSP_RVALUE(p2); } else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; return XP_NULL; } } - else if (XP_LSP_TYPE(p1) == XP_LSP_OBJ_FLOAT) { + else if (XP_LSP_TYPE(p1) == XP_LSP_OBJ_REAL) { if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_INT) { - res = XP_LSP_FVALUE(p1) > XP_LSP_IVALUE(p2); + res = XP_LSP_RVALUE(p1) > XP_LSP_IVALUE(p2); } - else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_FLOAT) { - res = XP_LSP_FVALUE(p1) > XP_LSP_FVALUE(p2); + else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_REAL) { + res = XP_LSP_RVALUE(p1) > XP_LSP_RVALUE(p2); } else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; @@ -445,20 +484,20 @@ xp_lsp_obj_t* xp_lsp_prim_lt (xp_lsp_t* lsp, xp_lsp_obj_t* args) if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_INT) { res = XP_LSP_IVALUE(p1) < XP_LSP_IVALUE(p2); } - else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_FLOAT) { - res = XP_LSP_IVALUE(p1) < XP_LSP_FVALUE(p2); + else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_REAL) { + res = XP_LSP_IVALUE(p1) < XP_LSP_RVALUE(p2); } else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; return XP_NULL; } } - else if (XP_LSP_TYPE(p1) == XP_LSP_OBJ_FLOAT) { + else if (XP_LSP_TYPE(p1) == XP_LSP_OBJ_REAL) { if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_INT) { - res = XP_LSP_FVALUE(p1) < XP_LSP_IVALUE(p2); + res = XP_LSP_RVALUE(p1) < XP_LSP_IVALUE(p2); } - else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_FLOAT) { - res = XP_LSP_FVALUE(p1) < XP_LSP_FVALUE(p2); + else if (XP_LSP_TYPE(p2) == XP_LSP_OBJ_REAL) { + res = XP_LSP_RVALUE(p1) < XP_LSP_RVALUE(p2); } else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; diff --git a/ase/lsp/prim.h b/ase/lsp/prim.h index 1cc219be..6a091fd8 100644 --- a/ase/lsp/prim.h +++ b/ase/lsp/prim.h @@ -1,5 +1,5 @@ /* - * $Id: prim.h,v 1.2 2005-09-20 08:05:32 bacon Exp $ + * $Id: prim.h,v 1.3 2005-09-20 11:19:15 bacon Exp $ */ #ifndef _XP_LSP_PRIM_H_ @@ -8,8 +8,6 @@ #include #include -typedef xp_lsp_obj_t* (*xp_lsp_pimpl_t) (xp_lsp_t*, xp_lsp_obj_t*); - #ifdef __cplusplus extern "C" { #endif diff --git a/ase/lsp/prim_math.c b/ase/lsp/prim_math.c index 06da4816..94a0e44c 100644 --- a/ase/lsp/prim_math.c +++ b/ase/lsp/prim_math.c @@ -1,5 +1,5 @@ /* - * $Id: prim_math.c,v 1.2 2005-09-20 09:17:06 bacon Exp $ + * $Id: prim_math.c,v 1.3 2005-09-20 11:19:15 bacon Exp $ */ #include @@ -8,29 +8,47 @@ xp_lsp_obj_t* xp_lsp_prim_plus (xp_lsp_t* lsp, xp_lsp_obj_t* args) { xp_lsp_obj_t* body, * tmp; - xp_lsp_int_t value = 0; + xp_lsp_int_t ivalue = 0; + xp_lsp_real_t rvalue = 0.; + xp_bool_t realnum = xp_false; XP_LSP_PRIM_CHECK_ARG_COUNT (lsp, args, 1, XP_LSP_PRIM_MAX_ARG_COUNT); xp_assert (XP_LSP_TYPE(args) == XP_LSP_OBJ_CONS); body = args; + //while (body != lsp->mem->nil) { while (XP_LSP_TYPE(body) == XP_LSP_OBJ_CONS) { tmp = xp_lsp_eval (lsp, XP_LSP_CAR(body)); if (tmp == XP_NULL) return XP_NULL; - if (XP_LSP_TYPE(tmp) != XP_LSP_OBJ_INT) { + if (XP_LSP_TYPE(tmp) == XP_LSP_OBJ_INT) { + if (!realnum) + ivalue = ivalue + XP_LSP_IVALUE(tmp); + else + rvalue = rvalue + XP_LSP_IVALUE(tmp); + } + else if (XP_LSP_TYPE(tmp) == XP_LSP_OBJ_REAL) { + if (!realnum) { + realnum = xp_true; + rvalue = (xp_lsp_real_t)ivalue; + } + + rvalue = rvalue + XP_LSP_RVALUE(tmp); + } + else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; return XP_NULL; } - value = value + XP_LSP_IVALUE(tmp); body = XP_LSP_CDR(body); } xp_assert (body == lsp->mem->nil); - tmp = xp_lsp_make_int (lsp->mem, value); + tmp = (realnum)? + xp_lsp_make_real (lsp->mem, rvalue): + xp_lsp_make_int (lsp->mem, ivalue); if (tmp == XP_NULL) { lsp->errnum = XP_LSP_ERR_MEM; return XP_NULL; @@ -42,7 +60,9 @@ xp_lsp_obj_t* xp_lsp_prim_plus (xp_lsp_t* lsp, xp_lsp_obj_t* args) xp_lsp_obj_t* xp_lsp_prim_minus (xp_lsp_t* lsp, xp_lsp_obj_t* args) { xp_lsp_obj_t* body, * tmp; - xp_lsp_int_t value = 0; + xp_lsp_int_t ivalue = 0; + xp_lsp_real_t rvalue = 0.; + xp_bool_t realnum = xp_false; XP_LSP_PRIM_CHECK_ARG_COUNT (lsp, args, 1, XP_LSP_PRIM_MAX_ARG_COUNT); xp_assert (XP_LSP_TYPE(args) == XP_LSP_OBJ_CONS); @@ -53,21 +73,47 @@ xp_lsp_obj_t* xp_lsp_prim_minus (xp_lsp_t* lsp, xp_lsp_obj_t* args) tmp = xp_lsp_eval (lsp, XP_LSP_CAR(body)); if (tmp == XP_NULL) return XP_NULL; - if (XP_LSP_TYPE(tmp) != XP_LSP_OBJ_INT) { + + if (XP_LSP_TYPE(tmp) == XP_LSP_OBJ_INT) { + if (body == args) { + xp_assert (realnum == xp_false); + ivalue = XP_LSP_IVALUE(tmp); + } + else { + if (!realnum) + ivalue = ivalue - XP_LSP_IVALUE(tmp); + else + rvalue = rvalue - XP_LSP_IVALUE(tmp); + } + } + else if (XP_LSP_TYPE(tmp) == XP_LSP_OBJ_REAL) { + if (body == args) { + xp_assert (realnum == xp_false); + realnum = xp_true; + rvalue = XP_LSP_RVALUE(tmp); + } + else { + if (!realnum) { + realnum = xp_true; + rvalue = (xp_lsp_real_t)ivalue; + } + rvalue = rvalue - XP_LSP_RVALUE(tmp); + } + } + else { lsp->errnum = XP_LSP_ERR_BAD_VALUE; return XP_NULL; } - if (body == args) - value = XP_LSP_IVALUE(tmp); - else value = value - XP_LSP_IVALUE(tmp); body = XP_LSP_CDR(body); } xp_assert (body == lsp->mem->nil); - tmp = xp_lsp_make_int (lsp->mem, value); + tmp = (realnum)? + xp_lsp_make_real (lsp->mem, rvalue): + xp_lsp_make_int (lsp->mem, ivalue); if (tmp == XP_NULL) { lsp->errnum = XP_LSP_ERR_MEM; return XP_NULL; @@ -75,3 +121,4 @@ xp_lsp_obj_t* xp_lsp_prim_minus (xp_lsp_t* lsp, xp_lsp_obj_t* args) return tmp; } + diff --git a/ase/lsp/print.c b/ase/lsp/print.c index 5d86e74c..c688e696 100644 --- a/ase/lsp/print.c +++ b/ase/lsp/print.c @@ -1,5 +1,5 @@ /* - * $Id: print.c,v 1.11 2005-09-20 08:05:32 bacon Exp $ + * $Id: print.c,v 1.12 2005-09-20 11:19:15 bacon Exp $ */ #include @@ -18,8 +18,8 @@ void xp_lsp_print_debug (xp_lsp_obj_t* obj) case XP_LSP_OBJ_INT: xp_printf (XP_TEXT("%d"), XP_LSP_IVALUE(obj)); break; - case XP_LSP_OBJ_FLOAT: - xp_printf (XP_TEXT("%f"), XP_LSP_FVALUE(obj)); + case XP_LSP_OBJ_REAL: + xp_printf (XP_TEXT("%f"), XP_LSP_RVALUE(obj)); break; case XP_LSP_OBJ_SYMBOL: xp_printf (XP_TEXT("%s"), XP_LSP_SYMVALUE(obj)); @@ -104,8 +104,16 @@ static int __print (xp_lsp_t* lsp, const xp_lsp_obj_t* obj, xp_bool_t prt_cons_p OUTPUT_STR (lsp, buf); break; - case XP_LSP_OBJ_FLOAT: - xp_sprintf (buf, xp_countof(buf), XP_TEXT("%f"), XP_LSP_FVALUE(obj)); + case XP_LSP_OBJ_REAL: + if (xp_sizeof(xp_lsp_real_t) == xp_sizeof(double)) { + xp_sprintf (buf, xp_countof(buf), XP_TEXT("%f"), + (double)XP_LSP_RVALUE(obj)); + } + else if (xp_sizeof(xp_lsp_real_t) == xp_sizeof(long double)) { + xp_sprintf (buf, xp_countof(buf), XP_TEXT("%Lf"), + (long double)XP_LSP_RVALUE(obj)); + } + OUTPUT_STR (lsp, buf); break; case XP_LSP_OBJ_SYMBOL: diff --git a/ase/lsp/read.c b/ase/lsp/read.c index c78c5b02..d4164eda 100644 --- a/ase/lsp/read.c +++ b/ase/lsp/read.c @@ -1,5 +1,5 @@ /* - * $Id: read.c,v 1.14 2005-09-20 08:05:32 bacon Exp $ + * $Id: read.c,v 1.15 2005-09-20 11:19:15 bacon Exp $ */ #include @@ -23,7 +23,7 @@ #define TOKEN_CLEAR(lsp) xp_lsp_token_clear (&(lsp)->token) #define TOKEN_TYPE(lsp) (lsp)->token.type #define TOKEN_IVALUE(lsp) (lsp)->token.ivalue -#define TOKEN_FVALUE(lsp) (lsp)->token.fvalue +#define TOKEN_RVALUE(lsp) (lsp)->token.rvalue #define TOKEN_SVALUE(lsp) (lsp)->token.name.buffer #define TOKEN_SLENGTH(lsp) (lsp)->token.name.size #define TOKEN_ADD_CHAR(lsp,ch) \ @@ -37,7 +37,7 @@ #define TOKEN_END 0 #define TOKEN_INT 1 -#define TOKEN_FLOAT 2 +#define TOKEN_REAL 2 #define TOKEN_STRING 3 #define TOKEN_LPAREN 4 #define TOKEN_RPAREN 5 @@ -98,13 +98,13 @@ static xp_lsp_obj_t* read_obj (xp_lsp_t* lsp) if (obj == XP_NULL) lsp->errnum = XP_LSP_ERR_MEM; xp_lsp_lock (obj); return obj; - case TOKEN_FLOAT: - obj = xp_lsp_make_float (lsp->mem, TOKEN_FVALUE(lsp)); + case TOKEN_REAL: + obj = xp_lsp_make_real (lsp->mem, TOKEN_RVALUE(lsp)); if (obj == XP_NULL) lsp->errnum = XP_LSP_ERR_MEM; xp_lsp_lock (obj); return obj; case TOKEN_STRING: - obj = xp_lsp_make_string ( + obj = xp_lsp_make_stringx ( lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp)); if (obj == XP_NULL) lsp->errnum = XP_LSP_ERR_MEM; xp_lsp_lock (obj); @@ -114,7 +114,7 @@ static xp_lsp_obj_t* read_obj (xp_lsp_t* lsp) if (TOKEN_COMPARE(lsp,XP_TEXT("nil")) == 0) obj = lsp->mem->nil; else if (TOKEN_COMPARE(lsp,XP_TEXT("t")) == 0) obj = lsp->mem->t; else { - obj = xp_lsp_make_symbol ( + obj = xp_lsp_make_symbolx ( lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp)); if (obj == XP_NULL) lsp->errnum = XP_LSP_ERR_MEM; xp_lsp_lock (obj); @@ -321,6 +321,7 @@ static int read_token (xp_lsp_t* lsp) static int read_number (xp_lsp_t* lsp, int negative) { xp_lsp_int_t ivalue = 0; + xp_lsp_real_t rvalue = 0.; do { ivalue = ivalue * 10 + (lsp->curc - XP_CHAR('0')); @@ -328,12 +329,28 @@ static int read_number (xp_lsp_t* lsp, int negative) NEXT_CHAR (lsp); } while (IS_DIGIT(lsp->curc)); - if (negative) ivalue *= -1; +/* TODO: extend parsing floating point number */ + if (lsp->curc == XP_CHAR('.')) { + xp_lsp_real_t fraction = 0.1; - TOKEN_IVALUE(lsp) = ivalue; - TOKEN_TYPE(lsp) = TOKEN_INT; + NEXT_CHAR (lsp); + rvalue = (xp_lsp_real_t)ivalue; -/* TODO: read floating point numbers */ + while (IS_DIGIT(lsp->curc)) { + rvalue += (xp_lsp_real_t)(lsp->curc - XP_CHAR('0')) * fraction; + fraction *= 0.1; + NEXT_CHAR (lsp); + } + + TOKEN_RVALUE(lsp) = rvalue; + TOKEN_TYPE(lsp) = TOKEN_REAL; + if (negative) rvalue *= -1; + } + else { + TOKEN_IVALUE(lsp) = ivalue; + TOKEN_TYPE(lsp) = TOKEN_INT; + if (negative) ivalue *= -1; + } return 0; } diff --git a/ase/lsp/token.h b/ase/lsp/token.h index 3af278d9..d516ae0c 100644 --- a/ase/lsp/token.h +++ b/ase/lsp/token.h @@ -1,5 +1,5 @@ /* - * $Id: token.h,v 1.9 2005-09-18 10:18:35 bacon Exp $ + * $Id: token.h,v 1.10 2005-09-20 11:19:15 bacon Exp $ */ #ifndef _XP_LSP_TOKEN_H_ @@ -18,7 +18,7 @@ struct xp_lsp_token_t int type; xp_lsp_int_t ivalue; - xp_lsp_real_t fvalue; + xp_lsp_real_t rvalue; xp_lsp_name_t name; xp_bool_t __malloced;