diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index 8756c17d..23d7ab53 100755 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -156,6 +156,7 @@ enum sexp_types { SEXP_CND, SEXP_REF, SEXP_SET, + SEXP_SET_SYN, SEXP_SEQ, SEXP_LIT, SEXP_STACK, @@ -448,6 +449,9 @@ struct sexp_struct { struct { sexp var, value, source; } set; + struct { + sexp var, value, source; + } set_syn; struct { sexp name, cell, source; } ref; @@ -725,6 +729,7 @@ sexp sexp_make_flonum(sexp ctx, double f); #define sexp_cndp(x) (sexp_check_tag(x, SEXP_CND)) #define sexp_refp(x) (sexp_check_tag(x, SEXP_REF)) #define sexp_setp(x) (sexp_check_tag(x, SEXP_SET)) +#define sexp_set_synp(x) (sexp_check_tag(x, SEXP_SET_SYN)) #define sexp_seqp(x) (sexp_check_tag(x, SEXP_SEQ)) #define sexp_litp(x) (sexp_check_tag(x, SEXP_LIT)) #define sexp_contextp(x) (sexp_check_tag(x, SEXP_CONTEXT)) @@ -1075,6 +1080,10 @@ SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x); #define sexp_set_value(x) (sexp_field(x, set, SEXP_SET, value)) #define sexp_set_source(x) (sexp_field(x, set, SEXP_SET, source)) +#define sexp_set_syn_var(x) (sexp_field(x, set, SEXP_SET_SYN, var)) +#define sexp_set_syn_value(x) (sexp_field(x, set, SEXP_SET_SYN, value)) +#define sexp_set_syn_source(x) (sexp_field(x, set, SEXP_SET_SYN, source)) + #define sexp_ref_name(x) (sexp_field(x, ref, SEXP_REF, name)) #define sexp_ref_cell(x) ((x)->value.ref.cell) #define sexp_ref_loc(x) (sexp_cdr(sexp_ref_cell(x))) diff --git a/sexp.c b/sexp.c index 25d24413..630a2ee4 100644 --- a/sexp.c +++ b/sexp.c @@ -218,6 +218,7 @@ static struct sexp_type_struct _sexp_type_specs[] = { {SEXP_CND, sexp_offsetof(cnd, test), 4, 4, 0, 0, sexp_sizeof(cnd), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"If", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, {SEXP_REF, sexp_offsetof(ref, name), 3, 3, 0, 0, sexp_sizeof(ref), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Ref", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, {SEXP_SET, sexp_offsetof(set, var), 3, 3, 0, 0, sexp_sizeof(set), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Set!", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, + {SEXP_SET_SYN, sexp_offsetof(set_syn, var), 3, 3, 0, 0, sexp_sizeof(set_syn), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Set-Syn!", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, {SEXP_SEQ, sexp_offsetof(seq, ls), 2, 2, 0, 0, sexp_sizeof(seq), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Seq", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, {SEXP_LIT, sexp_offsetof(lit, value), 2, 2, 0, 0, sexp_sizeof(lit), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Lit", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, (sexp)sexp_write_simple_object, NULL, NULL}, {SEXP_STACK, sexp_offsetof(stack, data), 0, 0, sexp_offsetof(stack, top), 1, sexp_sizeof(stack), offsetof(struct sexp_struct, value.stack.length), sizeof(sexp), 0, 0, 0, 0, 0, 0, (sexp)"Stack", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, NULL, NULL, NULL},