summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-18 18:22:05 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-18 18:22:05 +0000
commitdaadb2b174846cda95e51e0c4c94bcb748da4a69 (patch)
tree5cca963b24754af9fdfd9dde95c0286cfa225df3 /builtins.c
parent18ae80eac7b678d71b13710b978a03863c7e3fd2 (diff)
Load extra arguments as module files
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/builtins.c b/builtins.c
index d723e7c..b33bc49 100644
--- a/builtins.c
+++ b/builtins.c
@@ -62,6 +62,7 @@ BuiltinProto(builtinputchar);
BuiltinProto(builtincharcode);
BuiltinProto(builtinchoicestacksize);
BuiltinProto(builtincollectgarbage);
+BuiltinProto(builtinloadmodulefromfile);
int compareterms(Term *, Term *);
@@ -175,6 +176,8 @@ findbuiltin(Term *goal)
return builtinchoicestacksize;
if(Match(L"$collect_garbage", 0))
return builtincollectgarbage;
+ if(Match(L"$load_module_from_file", 1))
+ return builtinloadmodulefromfile;
return nil;
}
@@ -1421,4 +1424,25 @@ builtincollectgarbage(Term *goal, Binding **bindings, Module *module)
if(amount != 0 & flagdebug)
print("Collected %lld bytes of garbage\n", amount);
return 1;
+}
+
+int
+builtinloadmodulefromfile(Term *goal, Binding **bindings, Module *module)
+{
+ USED(bindings);
+ USED(module);
+ Term *file = goal->children;
+
+ if(file->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(file->tag != AtomTerm)
+ Throw(typeerror(L"atom", file));
+
+ char *filestr = smprint("%S", file->text);
+ Module *m = parsemodule(filestr);
+ free(filestr);
+ if(m)
+ return 1;
+ else
+ return 0;
} \ No newline at end of file