From bde09e063a5a6ec2011d63911c6d93e2894514f5 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 20 Oct 2013 14:04:39 +0900 Subject: [PATCH] add pic_acons function --- include/picrin/pair.h | 1 + src/pair.c | 6 ++++++ src/vm.c | 12 ++++++------ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/picrin/pair.h b/include/picrin/pair.h index 53cabfc9..82584b0c 100644 --- a/include/picrin/pair.h +++ b/include/picrin/pair.h @@ -8,5 +8,6 @@ pic_value pic_cdr(pic_state *, pic_value); pic_value pic_list(pic_state *, size_t, ...); pic_value pic_assq(pic_state *, pic_value key, pic_value assoc); +pic_value pic_acons(pic_state *, pic_value key, pic_value val, pic_value assoc); #endif diff --git a/src/pair.c b/src/pair.c index d2a4003f..1a60e184 100644 --- a/src/pair.c +++ b/src/pair.c @@ -50,3 +50,9 @@ pic_assq(pic_state *pic, pic_value key, pic_value assoc) assoc = pic_cdr(pic, assoc); goto enter; } + +pic_value +pic_acons(pic_state *pic, pic_value key, pic_value val, pic_value assoc) +{ + return pic_cons(pic, pic_cons(pic, key, val), assoc); +} diff --git a/src/vm.c b/src/vm.c index d28f70d0..d090a796 100644 --- a/src/vm.c +++ b/src/vm.c @@ -37,7 +37,7 @@ env_lookup(pic_state *pic, pic_value sym, struct pic_env *env, int *depth, int * static int env_global_define(pic_state *pic, pic_value sym) { - pic_value cell; + pic_value f; int d, idx; if (env_lookup(pic, sym, pic->global_env, &d, &idx)) { @@ -45,8 +45,8 @@ env_global_define(pic_state *pic, pic_value sym) } idx = pic->glen++; - cell = pic_cons(pic, sym, pic_float_value(idx)); - pic->global_env->assoc = pic_cons(pic, cell, pic->global_env->assoc); + f = pic_float_value(idx); + pic->global_env->assoc = pic_acons(pic, sym, f, pic->global_env->assoc); return idx; } @@ -55,7 +55,7 @@ static struct pic_env * env_new(pic_state *pic, pic_value args, struct pic_env *env) { struct pic_env *inner_env; - pic_value v, cell; + pic_value v, f; int i; inner_env = (struct pic_env *)pic_alloc(pic, sizeof(struct pic_env)); @@ -66,8 +66,8 @@ env_new(pic_state *pic, pic_value args, struct pic_env *env) for (v = args; ! pic_nil_p(v); v = pic_cdr(pic, v)) { pic_value sym = pic_car(pic, v); - cell = pic_cons(pic, sym, pic_float_value(i--)); - inner_env->assoc = pic_cons(pic, cell, inner_env->assoc); + f = pic_float_value(i--); + inner_env->assoc = pic_acons(pic, sym, f, inner_env->assoc); } return inner_env;