summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-11-13 20:45:10 -0800
committerKaz Kylheku <kaz@kylheku.com>2018-11-13 20:45:10 -0800
commit8e2aef8f2b466b37753ba0acd4bd668ff54b3669 (patch)
tree54380c2dc9a0565f9fdc25349a68552094d1e785 /lib.c
parent156004248adbb220505567309dfb1fc22f7ab5e4 (diff)
downloadtxr-8e2aef8f2b466b37753ba0acd4bd668ff54b3669.tar.gz
txr-8e2aef8f2b466b37753ba0acd4bd668ff54b3669.tar.bz2
txr-8e2aef8f2b466b37753ba0acd4bd668ff54b3669.zip
copy-fun: duplicate a function, with own environment.
* eval.c (deep_copy_env): New function. (eval_init): Register copy-fun intrinsic. * eval.h (deep_copy_env): Declared. * lib.c (copy_fun): New function. * lib.h (copy_fun): Declared. * vm.c (vm_copy_closure): New function. * vm.h (vm_copy_closure): Declared. * txr.1: Documented copy-fun.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index 33eddfe9..3d17a562 100644
--- a/lib.c
+++ b/lib.c
@@ -6129,6 +6129,21 @@ val func_vm(val closure, val desc, int fixparam, int reqargs, int variadic)
return obj;
}
+val copy_fun(val ofun)
+{
+ val self = lit("copy-fun");
+ type_check(self, ofun, FUN);
+ {
+ val nfun = make_obj();
+ nfun->f = ofun->f;
+
+ if (nfun->f.env)
+ nfun->f.env = if3(nfun->f.functype == FVM,
+ vm_copy_closure, deep_copy_env)(nfun->f.env);
+ return nfun;
+ }
+}
+
val func_get_form(val fun)
{
val self = lit("func-get-form");