diff --git a/include/picrin/cont.h b/include/picrin/cont.h index c08a2830..e846b7de 100644 --- a/include/picrin/cont.h +++ b/include/picrin/cont.h @@ -54,6 +54,7 @@ pic_value pic_callcc(pic_state *, struct pic_proc *); pic_value pic_values(pic_state *, size_t, ...); pic_value pic_values_by_array(pic_state *, size_t, pic_value *); pic_value pic_values_by_list(pic_state *, pic_value); +size_t pic_receive(pic_state *, size_t, pic_value *); #if defined(__cplusplus) } diff --git a/src/cont.c b/src/cont.c index 2da3fd3d..a113f01e 100644 --- a/src/cont.c +++ b/src/cont.c @@ -218,6 +218,21 @@ pic_values_by_list(pic_state *pic, pic_value list) return pic_nil_p(list) ? pic_none_value() : pic->ci->fp[0]; } +size_t +pic_receive(pic_state *pic, size_t n, pic_value *argv) +{ + size_t i; + + for (i = 0; ; ++i) { + if (pic_undef_p(pic->ci->fp[i])) + break; + if (i < n) { + argv[i] = pic->ci->fp[i]; + } + } + return i; +} + static pic_value pic_cont_callcc(pic_state *pic) {