summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-02-11 23:04:37 +0100
committerAndy Wingo <wingo@pobox.com>2009-02-11 23:04:37 +0100
commitdf8cd091f9ffd31a7f77337d2e804d6801ca61ee (patch)
treef6ee1b30c91800c9996e538485bec89d7c471447
parente14679bd52ce8b6ea700845cc5c8139725bcec1a (diff)
downloadguile-df8cd091f9ffd31a7f77337d2e804d6801ca61ee.tar.gz
provide program apply_0, apply_1, apply_2 implementations
* libguile/programs.c (program_apply_0, program_apply_1) (program_apply_2, scm_bootstrap_programs): Provides some cons-less smob application procedures. This molests some internal interfaces, but hey, we're internal.
-rw-r--r--libguile/programs.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libguile/programs.c b/libguile/programs.c
index 1c42e15d6..50b1b624b 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -98,6 +98,27 @@ program_apply (SCM program, SCM args)
return scm_vm_apply (scm_the_vm (), program, args);
}
+static SCM
+program_apply_0 (SCM program)
+{
+ return scm_c_vm_run (scm_the_vm (), program, NULL, 0);
+}
+
+static SCM
+program_apply_1 (SCM program, SCM a)
+{
+ return scm_c_vm_run (scm_the_vm (), program, &a, 1);
+}
+
+static SCM
+program_apply_2 (SCM program, SCM a, SCM b)
+{
+ SCM args[2];
+ args[0] = a;
+ args[1] = b;
+ return scm_c_vm_run (scm_the_vm (), program, args, 2);
+}
+
static int
program_print (SCM program, SCM port, scm_print_state *pstate)
{
@@ -343,6 +364,9 @@ scm_bootstrap_programs (void)
scm_tc16_program = scm_make_smob_type ("program", 0);
scm_set_smob_mark (scm_tc16_program, program_mark);
scm_set_smob_apply (scm_tc16_program, program_apply, 0, 0, 1);
+ scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_0 = program_apply_0;
+ scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_1 = program_apply_1;
+ scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_2 = program_apply_2;
scm_set_smob_print (scm_tc16_program, program_print);
}