X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fscheme%2Fao_scheme.h;h=9ce239a65d64ba8321ad87cca9a1728f132a122d;hb=4b52fc6eea9a478cb3dd42dcd32c92838df39734;hp=ad80db2f03cb433835d2e84c8da43b024ec7c8c5;hpb=ca27d467198c556be483961a6ca3b8f97bbe96a6;p=fw%2Faltos diff --git a/src/scheme/ao_scheme.h b/src/scheme/ao_scheme.h index ad80db2f..9ce239a6 100644 --- a/src/scheme/ao_scheme.h +++ b/src/scheme/ao_scheme.h @@ -15,18 +15,27 @@ #ifndef _AO_SCHEME_H_ #define _AO_SCHEME_H_ +#ifndef DBG_MEM #define DBG_MEM 0 +#endif +#ifndef DBG_EVAL #define DBG_EVAL 0 +#endif +#ifndef DBG_READ #define DBG_READ 0 +#endif +#ifndef DBG_FREE_CONS #define DBG_FREE_CONS 0 +#endif #define NDEBUG 1 #include #include +#include +#include #define AO_SCHEME_BUILTIN_FEATURES #include "ao_scheme_builtin.h" #undef AO_SCHEME_BUILTIN_FEATURES -#include #ifndef __BYTE_ORDER #include #endif @@ -34,7 +43,29 @@ typedef uint16_t ao_poly; typedef int16_t ao_signed_poly; -#if AO_SCHEME_SAVE +#ifdef AO_SCHEME_MAKE_CONST +#define AO_SCHEME_POOL_CONST 32764 +extern uint8_t ao_scheme_const[AO_SCHEME_POOL_CONST] __attribute__((aligned(4))); +#define ao_scheme_pool ao_scheme_const +#define AO_SCHEME_POOL AO_SCHEME_POOL_CONST + +#define _atom(n) ao_scheme_atom_poly(ao_scheme_atom_intern((char *) n)) +#define _bool(v) ao_scheme_bool_poly(ao_scheme_bool_get(v)) + +#define _ao_scheme_bool_true _bool(1) +#define _ao_scheme_bool_false _bool(0) + +#define _ao_scheme_atom_eof _atom("eof") +#define _ao_scheme_atom_else _atom("else") + +#define AO_SCHEME_BUILTIN_ATOMS +#include "ao_scheme_builtin.h" + +#else + +#include "ao_scheme_const.h" + +#ifdef AO_SCHEME_FEATURE_SAVE struct ao_scheme_os_save { ao_poly atoms; @@ -44,7 +75,7 @@ struct ao_scheme_os_save { }; #ifndef AO_SCHEME_POOL_TOTAL -#error Must define AO_SCHEME_POOL_TOTAL for AO_SCHEME_SAVE +#error Must define AO_SCHEME_POOL_TOTAL for AO_SCHEME_FEATURE_SAVE #endif #define AO_SCHEME_POOL_EXTRA (sizeof(struct ao_scheme_os_save)) @@ -58,29 +89,8 @@ ao_scheme_os_restore_save(struct ao_scheme_os_save *save, int offset); int ao_scheme_os_restore(void); +#endif /* AO_SCHEME_FEATURE_SAVE */ -#endif - -#ifdef AO_SCHEME_MAKE_CONST -#define AO_SCHEME_POOL_CONST 16384 -extern uint8_t ao_scheme_const[AO_SCHEME_POOL_CONST] __attribute__((aligned(4))); -#define ao_scheme_pool ao_scheme_const -#define AO_SCHEME_POOL AO_SCHEME_POOL_CONST - -#define _atom(n) ao_scheme_atom_poly(ao_scheme_atom_intern((char *) n)) -#define _bool(v) ao_scheme_bool_poly(ao_scheme_bool_get(v)) - -#define _ao_scheme_bool_true _bool(1) -#define _ao_scheme_bool_false _bool(0) - -#define _ao_scheme_atom_eof _atom("eof") -#define _ao_scheme_atom_else _atom("else") - -#define AO_SCHEME_BUILTIN_ATOMS -#include "ao_scheme_builtin.h" - -#else -#include "ao_scheme_const.h" #ifndef AO_SCHEME_POOL #error Must define AO_SCHEME_POOL #endif @@ -93,7 +103,7 @@ extern uint8_t ao_scheme_pool[AO_SCHEME_POOL + AO_SCHEME_POOL_EXTRA] __attribut /* Primitive types */ #define AO_SCHEME_CONS 0 #define AO_SCHEME_INT 1 -#define AO_SCHEME_STRING 2 +#define AO_SCHEME_BIGINT 2 #define AO_SCHEME_OTHER 3 #define AO_SCHEME_TYPE_MASK 0x0003 @@ -109,17 +119,12 @@ extern uint8_t ao_scheme_pool[AO_SCHEME_POOL + AO_SCHEME_POOL_EXTRA] __attribut #define AO_SCHEME_LAMBDA 8 #define AO_SCHEME_STACK 9 #define AO_SCHEME_BOOL 10 -#ifdef AO_SCHEME_FEATURE_BIGINT -#define AO_SCHEME_BIGINT 11 -#define _AO_SCHEME_BIGINT AO_SCHEME_BIGINT -#else -#define _AO_SCHEME_BIGINT AO_SCHEME_BOOL -#endif +#define AO_SCHEME_STRING 11 #ifdef AO_SCHEME_FEATURE_FLOAT -#define AO_SCHEME_FLOAT (_AO_SCHEME_BIGINT + 1) +#define AO_SCHEME_FLOAT 12 #define _AO_SCHEME_FLOAT AO_SCHEME_FLOAT #else -#define _AO_SCHEME_FLOAT _AO_SCHEME_BIGINT +#define _AO_SCHEME_FLOAT 12 #endif #ifdef AO_SCHEME_FEATURE_VECTOR #define AO_SCHEME_VECTOR 13 @@ -127,7 +132,13 @@ extern uint8_t ao_scheme_pool[AO_SCHEME_POOL + AO_SCHEME_POOL_EXTRA] __attribut #else #define _AO_SCHEME_VECTOR _AO_SCHEME_FLOAT #endif -#define AO_SCHEME_NUM_TYPE (_AO_SCHEME_VECTOR+1) +#ifdef AO_SCHEME_FEATURE_PORT +#define AO_SCHEME_PORT 14 +#define _AO_SCHEME_PORT AO_SCHEME_PORT +#else +#define _AO_SCHEME_PORT _AO_SCHEME_VECTOR +#endif +#define AO_SCHEME_NUM_TYPE (_AO_SCHEME_PORT+1) /* Leave two bits for types to use as they please */ #define AO_SCHEME_OTHER_TYPE_MASK 0x3f @@ -142,7 +153,8 @@ extern uint16_t ao_scheme_top; #define AO_SCHEME_UNDEFINED 0x08 #define AO_SCHEME_REDEFINED 0x10 #define AO_SCHEME_EOF 0x20 -#define AO_SCHEME_EXIT 0x40 +#define AO_SCHEME_FILEERROR 0x40 +#define AO_SCHEME_EXIT 0x80 extern uint8_t ao_scheme_exception; @@ -151,9 +163,17 @@ ao_scheme_is_const(ao_poly poly) { return poly & AO_SCHEME_CONST; } -#define AO_SCHEME_IS_CONST(a) (ao_scheme_const <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_const + AO_SCHEME_POOL_CONST) -#define AO_SCHEME_IS_POOL(a) (ao_scheme_pool <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_pool + AO_SCHEME_POOL) -#define AO_SCHEME_IS_INT(p) (ao_scheme_poly_base_type(p) == AO_SCHEME_INT) +static inline int +ao_scheme_is_const_addr(const void *addr) { + const uint8_t *a = addr; + return (ao_scheme_const <= a) && (a < ao_scheme_const + AO_SCHEME_POOL_CONST); +} + +static inline int +ao_scheme_is_pool_addr(const void *addr) { + const uint8_t *a = addr; + return (ao_scheme_pool <= a) && (a < ao_scheme_pool + AO_SCHEME_POOL); +} void * ao_scheme_ref(ao_poly poly); @@ -180,6 +200,11 @@ struct ao_scheme_atom { char name[]; }; +struct ao_scheme_string { + uint8_t type; + char val[]; +}; + struct ao_scheme_val { ao_poly atom; ao_poly val; @@ -223,45 +248,31 @@ struct ao_scheme_vector { }; #endif +#ifdef AO_SCHEME_FEATURE_PORT +struct ao_scheme_port { + uint8_t type; + uint8_t stayopen; + ao_poly next; + FILE *file; +}; +#endif + #define AO_SCHEME_MIN_INT (-(1 << (15 - AO_SCHEME_TYPE_SHIFT))) #define AO_SCHEME_MAX_INT ((1 << (15 - AO_SCHEME_TYPE_SHIFT)) - 1) #ifdef AO_SCHEME_FEATURE_BIGINT + struct ao_scheme_bigint { uint32_t value; }; -#define AO_SCHEME_MIN_BIGINT (-(1 << 24)) -#define AO_SCHEME_MAX_BIGINT ((1 << 24) - 1) +#define AO_SCHEME_MIN_BIGINT INT32_MIN +#define AO_SCHEME_MAX_BIGINT INT32_MAX -#if __BYTE_ORDER == __LITTLE_ENDIAN - -static inline uint32_t -ao_scheme_int_bigint(int32_t i) { - return AO_SCHEME_BIGINT | (i << 8); -} -static inline int32_t -ao_scheme_bigint_int(uint32_t bi) { - return (int32_t) bi >> 8; -} -#else -static inline uint32_t -ao_scheme_int_bigint(int32_t i) { - return (uint32_t) (i & 0xffffff) | (AO_SCHEME_BIGINT << 24); -} -static inlint int32_t -ao_scheme_bigint_int(uint32_t bi) { - return (int32_t) (bi << 8) >> 8; -} - -#endif /* __BYTE_ORDER */ #endif /* AO_SCHEME_FEATURE_BIGINT */ -#define AO_SCHEME_NOT_INTEGER 0x7fffffff - /* Set on type when the frame escapes the lambda */ #define AO_SCHEME_FRAME_MARK 0x80 -#define AO_SCHEME_FRAME_PRINT 0x40 static inline int ao_scheme_frame_marked(struct ao_scheme_frame *f) { return f->type & AO_SCHEME_FRAME_MARK; @@ -313,7 +324,6 @@ struct ao_scheme_stack { }; #define AO_SCHEME_STACK_MARK 0x80 /* set on type when a reference has been taken */ -#define AO_SCHEME_STACK_PRINT 0x40 /* stack is being printed */ static inline int ao_scheme_stack_marked(struct ao_scheme_stack *s) { return s->type & AO_SCHEME_STACK_MARK; @@ -475,20 +485,20 @@ ao_scheme_poly_bigint(ao_poly poly) static inline ao_poly ao_scheme_bigint_poly(struct ao_scheme_bigint *bi) { - return ao_scheme_poly(bi, AO_SCHEME_OTHER); + return ao_scheme_poly(bi, AO_SCHEME_BIGINT); } #endif /* AO_SCHEME_FEATURE_BIGINT */ -static inline char * +static inline struct ao_scheme_string * ao_scheme_poly_string(ao_poly poly) { return ao_scheme_ref(poly); } static inline ao_poly -ao_scheme_string_poly(char *s) +ao_scheme_string_poly(struct ao_scheme_string *s) { - return ao_scheme_poly(s, AO_SCHEME_STRING); + return ao_scheme_poly(s, AO_SCHEME_OTHER); } static inline struct ao_scheme_atom * @@ -558,6 +568,23 @@ ao_scheme_poly_vector(ao_poly poly) } #endif +#ifdef AO_SCHEME_FEATURE_PORT +static inline ao_poly +ao_scheme_port_poly(struct ao_scheme_port *v) +{ + return ao_scheme_poly(v, AO_SCHEME_OTHER); +} + +static inline struct ao_scheme_port * +ao_scheme_poly_port(ao_poly poly) +{ + return ao_scheme_ref(poly); +} + +extern ao_poly ao_scheme_stdin, ao_scheme_stdout, ao_scheme_stderr; + +#endif + /* memory functions */ extern uint64_t ao_scheme_collects[2]; @@ -568,6 +595,10 @@ extern uint64_t ao_scheme_loops[2]; int ao_scheme_mark_memory(const struct ao_scheme_type *type, void *addr); +/* returns 1 if the object is marked */ +int +ao_scheme_marked(void *addr); + /* returns 1 if the object was already moved */ int ao_scheme_move_memory(const struct ao_scheme_type *type, void **ref); @@ -575,6 +606,21 @@ ao_scheme_move_memory(const struct ao_scheme_type *type, void **ref); void * ao_scheme_alloc(int size); +/* Marks an object as being printed, returns 1 if it was already marked */ +int +ao_scheme_print_mark_addr(void *addr); + +void +ao_scheme_print_clear_addr(void *addr); + +/* Notes that printing has started */ +void +ao_scheme_print_start(void); + +/* Notes that printing has ended, returns 1 if printing is still happening */ +int +ao_scheme_print_stop(void); + #define AO_SCHEME_COLLECT_FULL 1 #define AO_SCHEME_COLLECT_INCREMENTAL 0 @@ -587,45 +633,91 @@ ao_scheme_cons_check(struct ao_scheme_cons *cons); #endif void -ao_scheme_cons_stash(int id, struct ao_scheme_cons *cons); +ao_scheme_poly_stash(ao_poly poly); -struct ao_scheme_cons * -ao_scheme_cons_fetch(int id); +ao_poly +ao_scheme_poly_fetch(void); -void -ao_scheme_poly_stash(int id, ao_poly poly); +static inline void +ao_scheme_cons_stash(struct ao_scheme_cons *cons) { + ao_scheme_poly_stash(ao_scheme_cons_poly(cons)); +} -ao_poly -ao_scheme_poly_fetch(int id); +static inline struct ao_scheme_cons * +ao_scheme_cons_fetch(void) { + return ao_scheme_poly_cons(ao_scheme_poly_fetch()); +} -void -ao_scheme_string_stash(int id, char *string); +static inline void +ao_scheme_atom_stash(struct ao_scheme_atom *atom) { + ao_scheme_poly_stash(ao_scheme_atom_poly(atom)); +} -char * -ao_scheme_string_fetch(int id); +static inline struct ao_scheme_atom * +ao_scheme_atom_fetch(void) { + return ao_scheme_poly_atom(ao_scheme_poly_fetch()); +} + +static inline void +ao_scheme_string_stash(struct ao_scheme_string *string) { + ao_scheme_poly_stash(ao_scheme_string_poly(string)); +} + +static inline struct ao_scheme_string * +ao_scheme_string_fetch(void) { + return ao_scheme_poly_string(ao_scheme_poly_fetch()); +} + +#ifdef AO_SCHEME_FEATURE_VECTOR +static inline void +ao_scheme_vector_stash(struct ao_scheme_vector *vector) { + ao_scheme_poly_stash(ao_scheme_vector_poly(vector)); +} + +static inline struct ao_scheme_vector * +ao_scheme_vector_fetch(void) { + return ao_scheme_poly_vector(ao_scheme_poly_fetch()); +} +#endif + +#ifdef AO_SCHEME_FEATURE_PORT +static inline void +ao_scheme_port_stash(struct ao_scheme_port *port) { + ao_scheme_poly_stash(ao_scheme_port_poly(port)); +} + +static inline struct ao_scheme_port * +ao_scheme_port_fetch(void) { + return ao_scheme_poly_port(ao_scheme_poly_fetch()); +} +#endif static inline void -ao_scheme_stack_stash(int id, struct ao_scheme_stack *stack) { - ao_scheme_poly_stash(id, ao_scheme_stack_poly(stack)); +ao_scheme_stack_stash(struct ao_scheme_stack *stack) { + ao_scheme_poly_stash(ao_scheme_stack_poly(stack)); } static inline struct ao_scheme_stack * -ao_scheme_stack_fetch(int id) { - return ao_scheme_poly_stack(ao_scheme_poly_fetch(id)); +ao_scheme_stack_fetch(void) { + return ao_scheme_poly_stack(ao_scheme_poly_fetch()); } -void -ao_scheme_frame_stash(int id, struct ao_scheme_frame *frame); +static inline void +ao_scheme_frame_stash(struct ao_scheme_frame *frame) { + ao_scheme_poly_stash(ao_scheme_frame_poly(frame)); +} -struct ao_scheme_frame * -ao_scheme_frame_fetch(int id); +static inline struct ao_scheme_frame * +ao_scheme_frame_fetch(void) { + return ao_scheme_poly_frame(ao_scheme_poly_fetch()); +} /* bool */ extern const struct ao_scheme_type ao_scheme_bool_type; void -ao_scheme_bool_write(ao_poly v); +ao_scheme_bool_write(FILE *out, ao_poly v, bool write); #ifdef AO_SCHEME_MAKE_CONST extern struct ao_scheme_bool *ao_scheme_true, *ao_scheme_false; @@ -645,7 +737,7 @@ struct ao_scheme_cons * ao_scheme_cons_cdr(struct ao_scheme_cons *cons); ao_poly -ao_scheme__cons(ao_poly car, ao_poly cdr); +ao_scheme_cons(ao_poly car, ao_poly cdr); extern struct ao_scheme_cons *ao_scheme_cons_free_list; @@ -653,37 +745,25 @@ void ao_scheme_cons_free(struct ao_scheme_cons *cons); void -ao_scheme_cons_write(ao_poly); - -void -ao_scheme_cons_display(ao_poly); +ao_scheme_cons_write(FILE *out, ao_poly, bool write); int ao_scheme_cons_length(struct ao_scheme_cons *cons); -struct ao_scheme_cons * -ao_scheme_cons_copy(struct ao_scheme_cons *cons); - /* string */ extern const struct ao_scheme_type ao_scheme_string_type; -char * -ao_scheme_string_copy(char *a); - -char * -ao_scheme_string_cat(char *a, char *b); - -ao_poly -ao_scheme_string_pack(struct ao_scheme_cons *cons); +struct ao_scheme_string * +ao_scheme_string_new(char *a); -ao_poly -ao_scheme_string_unpack(char *a); +struct ao_scheme_string * +ao_scheme_atom_to_string(struct ao_scheme_atom *a); -void -ao_scheme_string_write(ao_poly s); +struct ao_scheme_string * +ao_scheme_string_cat(struct ao_scheme_string *a, struct ao_scheme_string *b); void -ao_scheme_string_display(ao_poly s); +ao_scheme_string_write(FILE *out, ao_poly s, bool write); /* atom */ extern const struct ao_scheme_type ao_scheme_atom_type; @@ -693,26 +773,32 @@ extern struct ao_scheme_frame *ao_scheme_frame_global; extern struct ao_scheme_frame *ao_scheme_frame_current; void -ao_scheme_atom_write(ao_poly a); +ao_scheme_atom_write(FILE *out, ao_poly a, bool write); + +struct ao_scheme_atom * +ao_scheme_string_to_atom(struct ao_scheme_string *string); struct ao_scheme_atom * ao_scheme_atom_intern(char *name); +void +ao_scheme_atom_check_references(void); + +void +ao_scheme_atom_move(void); + ao_poly * ao_scheme_atom_ref(ao_poly atom, struct ao_scheme_frame **frame_ref); ao_poly ao_scheme_atom_get(ao_poly atom); -ao_poly -ao_scheme_atom_set(ao_poly atom, ao_poly val); - ao_poly ao_scheme_atom_def(ao_poly atom, ao_poly val); /* int */ void -ao_scheme_int_write(ao_poly i); +ao_scheme_int_write(FILE *out, ao_poly i, bool write); #ifdef AO_SCHEME_FEATURE_BIGINT int32_t @@ -728,14 +814,19 @@ ao_scheme_integer_typep(uint8_t t) } void -ao_scheme_bigint_write(ao_poly i); +ao_scheme_bigint_write(FILE *out, ao_poly i, bool write); extern const struct ao_scheme_type ao_scheme_bigint_type; #else -#define ao_scheme_poly_integer ao_scheme_poly_int -#define ao_scheme_integer_poly ao_scheme_int_poly +static inline int32_t ao_scheme_poly_integer(ao_poly poly) { + return ao_scheme_poly_int(poly); +} + +static inline ao_poly ao_scheme_integer_poly(int32_t i) { + return ao_scheme_int_poly(i); +} static inline int ao_scheme_integer_typep(uint8_t t) @@ -747,38 +838,82 @@ ao_scheme_integer_typep(uint8_t t) /* vector */ -void -ao_scheme_vector_write(ao_poly v); +#ifdef AO_SCHEME_FEATURE_VECTOR void -ao_scheme_vector_display(ao_poly v); +ao_scheme_vector_write(FILE *OUT, ao_poly v, bool write); struct ao_scheme_vector * ao_scheme_vector_alloc(uint16_t length, ao_poly fill); -ao_poly -ao_scheme_vector_get(ao_poly v, ao_poly i); - -ao_poly -ao_scheme_vector_set(ao_poly v, ao_poly i, ao_poly p); - struct ao_scheme_vector * ao_scheme_list_to_vector(struct ao_scheme_cons *cons); struct ao_scheme_cons * -ao_scheme_vector_to_list(struct ao_scheme_vector *vector); +ao_scheme_vector_to_list(struct ao_scheme_vector *vector, int start, int end); extern const struct ao_scheme_type ao_scheme_vector_type; -/* prim */ -void (*ao_scheme_poly_write_func(ao_poly p))(ao_poly p); -void (*ao_scheme_poly_display_func(ao_poly p))(ao_poly p); +#endif /* AO_SCHEME_FEATURE_VECTOR */ -static inline void -ao_scheme_poly_write(ao_poly p) { (*ao_scheme_poly_write_func(p))(p); } +/* port */ + +#ifdef AO_SCHEME_FEATURE_PORT + +void +ao_scheme_port_write(FILE *out, ao_poly v, bool write); + +struct ao_scheme_port * +ao_scheme_port_alloc(FILE *file, bool stayopen); + +void +ao_scheme_port_close(struct ao_scheme_port *port); + +void +ao_scheme_port_check_references(void); + +extern ao_poly ao_scheme_open_ports; + +static inline int +ao_scheme_port_getc(struct ao_scheme_port *port) +{ + if (port->file) + return getc(port->file); + return EOF; +} + +static inline int +ao_scheme_port_putc(struct ao_scheme_port *port, char c) +{ + if (port->file) + return putc(c, port->file); + return EOF; +} + +static inline int +ao_scheme_port_ungetc(struct ao_scheme_port *port, char c) +{ + if (port->file) + return ungetc(c, port->file); + return EOF; +} + +extern const struct ao_scheme_type ao_scheme_port_type; + +#endif /* AO_SCHEME_FEATURE_PORT */ + +#ifdef AO_SCHEME_FEATURE_POSIX + +void +ao_scheme_set_argv(char **argv); + +#endif + +/* prim */ +void (*ao_scheme_poly_write_func(ao_poly p))(FILE *out, ao_poly p, bool write); static inline void -ao_scheme_poly_display(ao_poly p) { (*ao_scheme_poly_display_func(p))(p); } +ao_scheme_poly_write(FILE *out, ao_poly p, bool write) { (*ao_scheme_poly_write_func(p))(out, p, write); } int ao_scheme_poly_mark(ao_poly p, uint8_t note_cons); @@ -789,11 +924,13 @@ ao_scheme_poly_move(ao_poly *p, uint8_t note_cons); /* eval */ +#ifdef AO_SCHEME_FEATURE_SAVE void ao_scheme_eval_clear_globals(void); int ao_scheme_eval_restart(void); +#endif ao_poly ao_scheme_eval(ao_poly p); @@ -806,14 +943,14 @@ ao_scheme_set_cond(struct ao_scheme_cons *cons); extern const struct ao_scheme_type ao_scheme_float_type; void -ao_scheme_float_write(ao_poly p); +ao_scheme_float_write(FILE *out, ao_poly p, bool write); ao_poly ao_scheme_float_get(float value); #endif #ifdef AO_SCHEME_FEATURE_FLOAT -static inline uint8_t +static inline bool ao_scheme_number_typep(uint8_t t) { return ao_scheme_integer_typep(t) || (t == AO_SCHEME_FLOAT); @@ -822,12 +959,35 @@ ao_scheme_number_typep(uint8_t t) #define ao_scheme_number_typep ao_scheme_integer_typep #endif +static inline bool +ao_scheme_is_integer(ao_poly poly) { + return ao_scheme_integer_typep(ao_scheme_poly_base_type(poly)); +} + +static inline bool +ao_scheme_is_number(ao_poly poly) { + return ao_scheme_number_typep(ao_scheme_poly_type(poly)); +} + /* builtin */ void -ao_scheme_builtin_write(ao_poly b); +ao_scheme_builtin_write(FILE *out, ao_poly b, bool write); + +ao_poly +ao_scheme_do_typep(ao_poly proc, int type, struct ao_scheme_cons *cons); extern const struct ao_scheme_type ao_scheme_builtin_type; +#define AO_SCHEME_ARG_OPTIONAL 0x100 +#define AO_SCHEME_ARG_NIL_OK 0x200 +#define AO_SCHEME_ARG_RET_POLY 0x400 +#define AO_SCHEME_ARG_END -1 +#define AO_SCHEME_POLY 0xff +#define AO_SCHEME_ARG_MASK 0xff + +int +ao_scheme_parse_args(ao_poly name, struct ao_scheme_cons *cons, ...); + /* Check argument count */ ao_poly ao_scheme_check_argc(ao_poly name, struct ao_scheme_cons *cons, int min, int max); @@ -850,11 +1010,11 @@ extern struct ao_scheme_cons *ao_scheme_read_cons_tail; extern struct ao_scheme_cons *ao_scheme_read_stack; ao_poly -ao_scheme_read(void); +ao_scheme_read(FILE *in); /* rep */ ao_poly -ao_scheme_read_eval_print(void); +ao_scheme_read_eval_print(FILE *read_file, FILE *write_file, bool interactive); /* frame */ extern const struct ao_scheme_type ao_scheme_frame_type; @@ -882,8 +1042,13 @@ ao_scheme_frame_bind(struct ao_scheme_frame *frame, int num, ao_poly atom, ao_po ao_poly ao_scheme_frame_add(struct ao_scheme_frame *frame, ao_poly atom, ao_poly val); +#ifdef AO_SCHEME_FEATURE_UNDEF +ao_poly +ao_scheme_frame_del(struct ao_scheme_frame *frame, ao_poly atom); +#endif + void -ao_scheme_frame_write(ao_poly p); +ao_scheme_frame_write(FILE *out, ao_poly p, bool write); void ao_scheme_frame_init(void); @@ -897,7 +1062,7 @@ struct ao_scheme_lambda * ao_scheme_lambda_new(ao_poly cons); void -ao_scheme_lambda_write(ao_poly lambda); +ao_scheme_lambda_write(FILE *out, ao_poly lambda, bool write); ao_poly ao_scheme_lambda_eval(void); @@ -908,6 +1073,8 @@ extern const struct ao_scheme_type ao_scheme_stack_type; extern struct ao_scheme_stack *ao_scheme_stack; extern struct ao_scheme_stack *ao_scheme_stack_free_list; +extern int ao_scheme_frame_print_indent; + void ao_scheme_stack_reset(struct ao_scheme_stack *stack); @@ -918,10 +1085,7 @@ void ao_scheme_stack_pop(void); void -ao_scheme_stack_clear(void); - -void -ao_scheme_stack_write(ao_poly stack); +ao_scheme_stack_write(FILE *out, ao_poly stack, bool write); ao_poly ao_scheme_stack_eval(void); @@ -929,16 +1093,10 @@ ao_scheme_stack_eval(void); /* error */ void -ao_scheme_vprintf(const char *format, va_list args); - -void -ao_scheme_printf(const char *format, ...); - -void -ao_scheme_error_poly(const char *name, ao_poly poly, ao_poly last); +ao_scheme_vfprintf(FILE *out, const char *format, va_list args); void -ao_scheme_error_frame(int indent, const char *name, struct ao_scheme_frame *frame); +ao_scheme_fprintf(FILE *out, const char *format, ...); ao_poly ao_scheme_error(int error, const char *format, ...); @@ -950,20 +1108,22 @@ ao_scheme_error(int error, const char *format, ...); /* debugging macros */ -#if DBG_EVAL || DBG_READ || DBG_MEM -#define DBG_CODE 1 +#if DBG_EVAL || DBG_READ int ao_scheme_stack_depth; +#endif + +#if DBG_EVAL #define DBG_DO(a) a #define DBG_INDENT() do { int _s; for(_s = 0; _s < ao_scheme_stack_depth; _s++) printf(" "); } while(0) #define DBG_IN() (++ao_scheme_stack_depth) #define DBG_OUT() (--ao_scheme_stack_depth) #define DBG_RESET() (ao_scheme_stack_depth = 0) -#define DBG(...) ao_scheme_printf(__VA_ARGS__) +#define DBG(...) ao_scheme_fprintf(stdout, __VA_ARGS__) #define DBGI(...) do { printf("%4d: ", __LINE__); DBG_INDENT(); DBG(__VA_ARGS__); } while (0) -#define DBG_CONS(a) ao_scheme_cons_write(ao_scheme_cons_poly(a)) -#define DBG_POLY(a) ao_scheme_poly_write(a) +#define DBG_CONS(a) ao_scheme_cons_write(stdout, ao_scheme_cons_poly(a), true) +#define DBG_POLY(a) ao_scheme_poly_write(stdout, a, true) #define OFFSET(a) ((a) ? (int) ((uint8_t *) a - ao_scheme_pool) : -1) -#define DBG_STACK() ao_scheme_stack_write(ao_scheme_stack_poly(ao_scheme_stack)) +#define DBG_STACK() ao_scheme_stack_write(stdout, ao_scheme_stack_poly(ao_scheme_stack), true) static inline void ao_scheme_frames_dump(void) { @@ -989,31 +1149,50 @@ ao_scheme_frames_dump(void) #endif #if DBG_READ -#define RDBGI(...) DBGI(__VA_ARGS__) -#define RDBG_IN() DBG_IN() -#define RDBG_OUT() DBG_OUT() +#define RDBGI(...) do { printf("%4d: ", __LINE__); DBG_INDENT(); ao_scheme_printf(__VA_ARGS__); } while (0) +#define RDBG_IN() (++ao_scheme_stack_depth) +#define RDBG_OUT() (--ao_scheme_stack_depth) #else #define RDBGI(...) #define RDBG_IN() #define RDBG_OUT() #endif -#define DBG_MEM_START 1 +static inline int +ao_scheme_mdbg_offset(void *a) +{ + uint8_t *u = a; + + if (u == 0) + return -1; + + if (ao_scheme_pool <= u && u < ao_scheme_pool + AO_SCHEME_POOL) + return u - ao_scheme_pool; + +#ifndef AO_SCHEME_MAKE_CONST + if (ao_scheme_const <= u && u < ao_scheme_const + AO_SCHEME_POOL_CONST) + return - (int) (u - ao_scheme_const); +#endif + return -2; +} + +#define MDBG_OFFSET(a) ao_scheme_mdbg_offset(a) #if DBG_MEM +#define DBG_MEM_START 1 + #include extern int dbg_move_depth; #define MDBG_DUMP 1 -#define MDBG_OFFSET(a) ((a) ? (int) ((uint8_t *) (a) - ao_scheme_pool) : -1) extern int dbg_mem; -#define MDBG_DO(a) DBG_DO(a) +#define MDBG_DO(a) a #define MDBG_MOVE(...) do { if (dbg_mem) { int d; for (d = 0; d < dbg_move_depth; d++) printf (" "); printf(__VA_ARGS__); } } while (0) #define MDBG_MORE(...) do { if (dbg_mem) printf(__VA_ARGS__); } while (0) #define MDBG_MOVE_IN() (dbg_move_depth++) -#define MDBG_MOVE_OUT() (assert(--dbg_move_depth >= 0)) +#define MDBG_MOVE_OUT() (--dbg_move_depth) #else