summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-16 20:09:02 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-16 20:09:02 +0000
commit3f316c5c9265618fe7095cc39c4cb10909cbe468 (patch)
treed01a693fd4f19e56a644905848b38aaef4974025 /builtins.c
parent8ef27e2fe652a8b29a8b57589863f2f2b45f9425 (diff)
Implement a bit more of prolog flag predicates set_prolog_flag/2 and current_prolog_flag/2
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/builtins.c b/builtins.c
index bde52fd..74b1bc4 100644
--- a/builtins.c
+++ b/builtins.c
@@ -38,7 +38,7 @@ BuiltinProto(builtinis);
BuiltinProto(builtincatch);
BuiltinProto(builtinthrow);
BuiltinProto(builtinsetprologflag);
-BuiltinProto(builtincurrentprologflag);
+BuiltinProto(builtincurrentprologflags);
BuiltinProto(builtinopen);
BuiltinProto(builtinclose);
BuiltinProto(builtincurrentinput);
@@ -125,10 +125,10 @@ findbuiltin(Term *goal)
return builtincatch;
if(Match(L"throw", 1))
return builtinthrow;
- if(Match(L"set_prolog_flag", 2))
+ if(Match(L"$set_prolog_flag", 2))
return builtinsetprologflag;
- if(Match(L"current_prolog_flag", 2))
- return builtincurrentprologflag;
+ if(Match(L"current_prolog_flags", 1))
+ return builtincurrentprologflags;
if(Match(L"open", 4))
return builtinopen;
if(Match(L"close", 2))
@@ -605,12 +605,13 @@ builtinthrow(Term *goal, Binding **bindings, Module *module)
}
int
-builtincurrentprologflag(Term *goal, Binding **bindings, Module *module)
+builtincurrentprologflags(Term *goal, Binding **bindings, Module *module)
{
- USED(goal);
- USED(bindings);
USED(module);
- return 0;
+ Term *flagsandvals = goal->children;
+ Term *list = getallflags();
+ Term *realflagsandvals = mklist(list);
+ return unify(flagsandvals, realflagsandvals, bindings);
}
int
@@ -621,15 +622,7 @@ builtinsetprologflag(Term *goal, Binding **bindings, Module *module)
Term *key = goal->children;
Term *value = key->next;
- if(key->tag == VariableTerm || value->tag == VariableTerm)
- Throw(instantiationerror());
-
- if(key->tag != AtomTerm)
- Throw(typeerror(L"atom", key));
-
- Term *error = setflag(key->text, value);
- if(error)
- Throw(error);
+ setflag(key->text, value);
return 1;
}