struct pic_pair * -> pic_value

This commit is contained in:
Yuichi Nishiwaki 2016-02-19 22:09:06 +09:00
parent 25e19d4f00
commit 1e08a7f21a
5 changed files with 32 additions and 50 deletions

View File

@ -53,7 +53,6 @@ typedef struct {
struct pic_object; struct pic_object;
struct pic_symbol; struct pic_symbol;
struct pic_pair;
struct pic_string; struct pic_string;
struct pic_blob; struct pic_blob;
struct pic_proc; struct pic_proc;
@ -64,7 +63,6 @@ struct pic_data;
typedef struct pic_symbol pic_sym; typedef struct pic_symbol pic_sym;
typedef struct pic_id pic_id; typedef struct pic_id pic_id;
typedef struct pic_pair pic_pair;
typedef void *(*pic_allocf)(void *userdata, void *ptr, size_t n); typedef void *(*pic_allocf)(void *userdata, void *ptr, size_t n);

View File

@ -120,11 +120,11 @@ struct pic_port {
xFILE *file; xFILE *file;
}; };
#define pic_pair_ptr(pic, o) ((struct pic_pair *)pic_obj_ptr(o))
#define pic_vec_ptr(pic, o) ((struct pic_vector *)pic_obj_ptr(o)) #define pic_vec_ptr(pic, o) ((struct pic_vector *)pic_obj_ptr(o))
#define pic_dict_ptr(pic, v) ((struct pic_dict *)pic_obj_ptr(v)) #define pic_dict_ptr(pic, v) ((struct pic_dict *)pic_obj_ptr(v))
#define pic_sym_ptr(v) ((pic_sym *)pic_obj_ptr(v)) #define pic_sym_ptr(v) ((pic_sym *)pic_obj_ptr(v))
#define pic_id_ptr(v) ((pic_id *)pic_obj_ptr(v)) #define pic_id_ptr(v) ((pic_id *)pic_obj_ptr(v))
#define pic_pair_ptr(o) ((struct pic_pair *)pic_obj_ptr(o))
#define pic_blob_ptr(v) ((struct pic_blob *)pic_obj_ptr(v)) #define pic_blob_ptr(v) ((struct pic_blob *)pic_obj_ptr(v))
#define pic_str_ptr(o) ((struct pic_string *)pic_obj_ptr(o)) #define pic_str_ptr(o) ((struct pic_string *)pic_obj_ptr(o))
#define pic_weak_ptr(v) ((struct pic_weak *)pic_obj_ptr(v)) #define pic_weak_ptr(v) ((struct pic_weak *)pic_obj_ptr(v))

View File

@ -20,53 +20,37 @@ pic_cons(pic_state *pic, pic_value car, pic_value cdr)
pic_value pic_value
pic_car(pic_state *pic, pic_value obj) pic_car(pic_state *pic, pic_value obj)
{ {
struct pic_pair *pair;
if (! pic_pair_p(pic, obj)) { if (! pic_pair_p(pic, obj)) {
pic_errorf(pic, "car: pair required, but got ~s", obj); pic_errorf(pic, "car: pair required, but got ~s", obj);
} }
pair = pic_pair_ptr(obj); return pic_pair_ptr(pic, obj)->car;
return pair->car;
} }
pic_value pic_value
pic_cdr(pic_state *pic, pic_value obj) pic_cdr(pic_state *pic, pic_value obj)
{ {
struct pic_pair *pair;
if (! pic_pair_p(pic, obj)) { if (! pic_pair_p(pic, obj)) {
pic_errorf(pic, "cdr: pair required, but got ~s", obj); pic_errorf(pic, "cdr: pair required, but got ~s", obj);
} }
pair = pic_pair_ptr(obj); return pic_pair_ptr(pic, obj)->cdr;
return pair->cdr;
} }
void void
pic_set_car(pic_state *pic, pic_value obj, pic_value val) pic_set_car(pic_state *pic, pic_value obj, pic_value val)
{ {
struct pic_pair *pair;
if (! pic_pair_p(pic, obj)) { if (! pic_pair_p(pic, obj)) {
pic_errorf(pic, "pair required"); pic_errorf(pic, "pair required");
} }
pair = pic_pair_ptr(obj); pic_pair_ptr(pic, obj)->car = val;
pair->car = val;
} }
void void
pic_set_cdr(pic_state *pic, pic_value obj, pic_value val) pic_set_cdr(pic_state *pic, pic_value obj, pic_value val)
{ {
struct pic_pair *pair;
if (! pic_pair_p(pic, obj)) { if (! pic_pair_p(pic, obj)) {
pic_errorf(pic, "pair required"); pic_errorf(pic, "pair required");
} }
pair = pic_pair_ptr(obj); pic_pair_ptr(pic, obj)->cdr = val;
pair->cdr = val;
} }
pic_value pic_value
@ -107,7 +91,7 @@ pic_list_p(pic_state *pic, pic_value obj)
/* advance rapid fast-forward; runs 2x faster than local */ /* advance rapid fast-forward; runs 2x faster than local */
for (i = 0; i < 2; ++i) { for (i = 0; i < 2; ++i) {
if (pic_pair_p(pic, rapid)) { if (pic_pair_p(pic, rapid)) {
rapid = pic_pair_ptr(rapid)->cdr; rapid = pic_pair_ptr(pic, rapid)->cdr;
} }
else { else {
return pic_nil_p(pic, rapid); return pic_nil_p(pic, rapid);
@ -115,7 +99,7 @@ pic_list_p(pic_state *pic, pic_value obj)
} }
/* advance local */ /* advance local */
local = pic_pair_ptr(local)->cdr; local = pic_pair_ptr(pic, local)->cdr;
if (pic_eq_p(pic, local, rapid)) { if (pic_eq_p(pic, local, rapid)) {
return false; return false;
@ -169,7 +153,7 @@ pic_list_ref(pic_state *pic, pic_value list, int i)
void void
pic_list_set(pic_state *pic, pic_value list, int i, pic_value obj) pic_list_set(pic_state *pic, pic_value list, int i, pic_value obj)
{ {
pic_pair_ptr(pic_list_tail(pic, list, i))->car = obj; pic_pair_ptr(pic, pic_list_tail(pic, list, i))->car = obj;
} }
pic_value pic_value

View File

@ -622,8 +622,8 @@ read_label_set(pic_state *pic, xFILE *file, int i)
kh_val(h, it) = val = pic_cons(pic, pic_undef_value(pic), pic_undef_value(pic)); kh_val(h, it) = val = pic_cons(pic, pic_undef_value(pic), pic_undef_value(pic));
tmp = read(pic, file, c); tmp = read(pic, file, c);
pic_pair_ptr(val)->car = pic_car(pic, tmp); pic_pair_ptr(pic, val)->car = pic_car(pic, tmp);
pic_pair_ptr(val)->cdr = pic_cdr(pic, tmp); pic_pair_ptr(pic, val)->cdr = pic_cdr(pic, tmp);
return val; return val;
} }

View File

@ -119,7 +119,7 @@ write_float(pic_state *pic, double f, xFILE *file)
static void write_core(struct writer_control *p, pic_value); static void write_core(struct writer_control *p, pic_value);
static void static void
write_pair_help(struct writer_control *p, struct pic_pair *pair) write_pair_help(struct writer_control *p, pic_value pair)
{ {
pic_state *pic = p->pic; pic_state *pic = p->pic;
khash_t(l) *lh = &p->labels; khash_t(l) *lh = &p->labels;
@ -127,18 +127,18 @@ write_pair_help(struct writer_control *p, struct pic_pair *pair)
khiter_t it; khiter_t it;
int ret; int ret;
write_core(p, pair->car); write_core(p, pic_car(pic, pair));
if (pic_nil_p(pic, pair->cdr)) { if (pic_nil_p(pic, pic_cdr(pic, pair))) {
return; return;
} }
else if (pic_pair_p(pic, pair->cdr)) { else if (pic_pair_p(pic, pic_cdr(pic, pair))) {
/* shared objects */ /* shared objects */
if ((it = kh_get(l, lh, pic_obj_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) { if ((it = kh_get(l, lh, pic_obj_ptr(pic_cdr(pic, pair)))) != kh_end(lh) && kh_val(lh, it) != -1) {
xfprintf(pic, p->file, " . "); xfprintf(pic, p->file, " . ");
kh_put(v, vh, pic_obj_ptr(pair->cdr), &ret); kh_put(v, vh, pic_obj_ptr(pic_cdr(pic, pair)), &ret);
if (ret == 0) { /* if exists */ if (ret == 0) { /* if exists */
xfprintf(pic, p->file, "#%d#", kh_val(lh, it)); xfprintf(pic, p->file, "#%d#", kh_val(lh, it));
return; return;
@ -149,11 +149,11 @@ write_pair_help(struct writer_control *p, struct pic_pair *pair)
xfprintf(pic, p->file, " "); xfprintf(pic, p->file, " ");
} }
write_pair_help(p, pic_pair_ptr(pair->cdr)); write_pair_help(p, pic_cdr(pic, pair));
if (p->op == OP_WRITE) { if (p->op == OP_WRITE) {
if ((it = kh_get(l, lh, pic_obj_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) { if ((it = kh_get(l, lh, pic_obj_ptr(pic_cdr(pic, pair)))) != kh_end(lh) && kh_val(lh, it) != -1) {
it = kh_get(v, vh, pic_obj_ptr(pair->cdr)); it = kh_get(v, vh, pic_obj_ptr(pic_cdr(pic, pair)));
kh_del(v, vh, it); kh_del(v, vh, it);
} }
} }
@ -161,57 +161,57 @@ write_pair_help(struct writer_control *p, struct pic_pair *pair)
} }
else { else {
xfprintf(pic, p->file, " . "); xfprintf(pic, p->file, " . ");
write_core(p, pair->cdr); write_core(p, pic_cdr(pic, pair));
} }
} }
static void static void
write_pair(struct writer_control *p, struct pic_pair *pair) write_pair(struct writer_control *p, pic_value pair)
{ {
pic_state *pic = p->pic; pic_state *pic = p->pic;
xFILE *file = p->file; xFILE *file = p->file;
pic_sym *tag; pic_sym *tag;
if (pic_pair_p(pic, pair->cdr) && pic_nil_p(pic, pic_cdr(pic, pair->cdr)) && pic_sym_p(pic, pair->car)) { if (pic_pair_p(pic, pic_cdr(pic, pair)) && pic_nil_p(pic, pic_cddr(pic, pair)) && pic_sym_p(pic, pic_car(pic, pair))) {
tag = pic_sym_ptr(pair->car); tag = pic_sym_ptr(pic_car(pic, pair));
if (tag == pic->sQUOTE) { if (tag == pic->sQUOTE) {
xfprintf(pic, file, "'"); xfprintf(pic, file, "'");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sUNQUOTE) { else if (tag == pic->sUNQUOTE) {
xfprintf(pic, file, ","); xfprintf(pic, file, ",");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sUNQUOTE_SPLICING) { else if (tag == pic->sUNQUOTE_SPLICING) {
xfprintf(pic, file, ",@"); xfprintf(pic, file, ",@");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sQUASIQUOTE) { else if (tag == pic->sQUASIQUOTE) {
xfprintf(pic, file, "`"); xfprintf(pic, file, "`");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sSYNTAX_QUOTE) { else if (tag == pic->sSYNTAX_QUOTE) {
xfprintf(pic, file, "#'"); xfprintf(pic, file, "#'");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sSYNTAX_UNQUOTE) { else if (tag == pic->sSYNTAX_UNQUOTE) {
xfprintf(pic, file, "#,"); xfprintf(pic, file, "#,");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sSYNTAX_UNQUOTE_SPLICING) { else if (tag == pic->sSYNTAX_UNQUOTE_SPLICING) {
xfprintf(pic, file, "#,@"); xfprintf(pic, file, "#,@");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
else if (tag == pic->sSYNTAX_QUASIQUOTE) { else if (tag == pic->sSYNTAX_QUASIQUOTE) {
xfprintf(pic, file, "#`"); xfprintf(pic, file, "#`");
write_core(p, pic_car(pic, pair->cdr)); write_core(p, pic_cadr(pic, pair));
return; return;
} }
} }
@ -312,7 +312,7 @@ write_core(struct writer_control *p, pic_value obj)
write_str(pic, pic_str_ptr(obj), file, p->mode); write_str(pic, pic_str_ptr(obj), file, p->mode);
break; break;
case PIC_TYPE_PAIR: case PIC_TYPE_PAIR:
write_pair(p, pic_pair_ptr(obj)); write_pair(p, obj);
break; break;
case PIC_TYPE_VECTOR: case PIC_TYPE_VECTOR:
write_vec(p, obj); write_vec(p, obj);