cleanup
This commit is contained in:
parent
19f426a4f4
commit
078b72ff17
|
@ -50,12 +50,13 @@ struct pic_cont {
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
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 *);
|
||||
|
||||
pic_value pic_callcc(pic_state *, struct pic_proc *);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -909,7 +909,7 @@
|
|||
(lambda (form rename compare?)
|
||||
(let ((expr (cadr form)))
|
||||
`(make-promise% #f (lambda () ,expr))))))
|
||||
|
||||
|
||||
(define-syntax delay
|
||||
(ir-macro-transformer
|
||||
(lambda (form rename compare?)
|
||||
|
@ -919,7 +919,7 @@
|
|||
(define (promise-update! new old)
|
||||
(promise-done! old (promise-done? new))
|
||||
(promise-value! old (promise-value new)))
|
||||
|
||||
|
||||
(define (force promise)
|
||||
(if (promise-done? promise)
|
||||
(promise-value promise)
|
||||
|
|
126
src/cont.c
126
src/cont.c
|
@ -11,6 +11,69 @@
|
|||
#include "picrin/cont.h"
|
||||
#include "picrin/pair.h"
|
||||
|
||||
pic_value
|
||||
pic_values(pic_state *pic, size_t c, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t i;
|
||||
|
||||
va_start(ap, c);
|
||||
|
||||
for (i = 0; i < c; ++i) {
|
||||
pic->sp[i] = va_arg(ap, pic_value);
|
||||
}
|
||||
pic->ci->retc = c;
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return c == 0 ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_values_by_array(pic_state *pic, size_t argc, pic_value *argv)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < argc; ++i) {
|
||||
pic->sp[i] = argv[i];
|
||||
}
|
||||
pic->ci->retc = argc;
|
||||
|
||||
return argc == 0 ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_values_by_list(pic_state *pic, pic_value list)
|
||||
{
|
||||
pic_value v;
|
||||
size_t i;
|
||||
|
||||
i = 0;
|
||||
pic_for_each (v, list) {
|
||||
pic->sp[i++] = v;
|
||||
}
|
||||
pic->ci->retc = i;
|
||||
|
||||
return pic_nil_p(list) ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
size_t
|
||||
pic_receive(pic_state *pic, size_t n, pic_value *argv)
|
||||
{
|
||||
pic_callinfo *ci;
|
||||
size_t i, retc;
|
||||
|
||||
/* take info from discarded frame */
|
||||
ci = pic->ci + 1;
|
||||
retc = ci->retc;
|
||||
|
||||
for (i = 0; i < retc && i < n; ++i) {
|
||||
argv[i] = ci->fp[i];
|
||||
}
|
||||
|
||||
return retc;
|
||||
}
|
||||
|
||||
static void save_cont(pic_state *, struct pic_cont **);
|
||||
static void restore_cont(pic_state *, struct pic_cont *);
|
||||
|
||||
|
@ -172,69 +235,6 @@ pic_callcc(pic_state *pic, struct pic_proc *proc)
|
|||
}
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_values(pic_state *pic, size_t c, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t i;
|
||||
|
||||
va_start(ap, c);
|
||||
|
||||
for (i = 0; i < c; ++i) {
|
||||
pic->sp[i] = va_arg(ap, pic_value);
|
||||
}
|
||||
pic->ci->retc = c;
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return c == 0 ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_values_by_array(pic_state *pic, size_t argc, pic_value *argv)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < argc; ++i) {
|
||||
pic->sp[i] = argv[i];
|
||||
}
|
||||
pic->ci->retc = argc;
|
||||
|
||||
return argc == 0 ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_values_by_list(pic_state *pic, pic_value list)
|
||||
{
|
||||
pic_value v;
|
||||
size_t i;
|
||||
|
||||
i = 0;
|
||||
pic_for_each (v, list) {
|
||||
pic->sp[i++] = v;
|
||||
}
|
||||
pic->ci->retc = i;
|
||||
|
||||
return pic_nil_p(list) ? pic_none_value() : pic->sp[0];
|
||||
}
|
||||
|
||||
size_t
|
||||
pic_receive(pic_state *pic, size_t n, pic_value *argv)
|
||||
{
|
||||
pic_callinfo *ci;
|
||||
size_t i, retc;
|
||||
|
||||
/* take info from discarded frame */
|
||||
ci = pic->ci + 1;
|
||||
retc = ci->retc;
|
||||
|
||||
for (i = 0; i < retc && i < n; ++i) {
|
||||
argv[i] = ci->fp[i];
|
||||
}
|
||||
|
||||
return retc;
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_callcc_trampoline(pic_state *pic, struct pic_proc *proc)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue