diff options
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 24 |
1 files changed, 17 insertions, 7 deletions
@@ -52,6 +52,7 @@ BuiltinProto(builtinclause); BuiltinProto(builtincurrentpredicate); BuiltinProto(builtinasserta); BuiltinProto(builtinassertz); +BuiltinProto(builtininsertclause); BuiltinProto(builtinretractone); BuiltinProto(builtinabolish); BuiltinProto(builtinatomlength); @@ -162,6 +163,8 @@ findbuiltin(Term *goal) return builtinasserta; if(Match(L"assertz", 1)) return builtinassertz; + if(Match(L"$insert_clause", 1)) + return builtininsertclause; if(Match(L"retract_one", 1)) return builtinretractone; if(Match(L"abolish", 1)) @@ -1103,7 +1106,7 @@ builtincurrentpredicate(Term *goal, Binding **bindings, Module *module) } int -assertclause(Term *clause, Module *module, int after) +assertclause(Term *clause, Module *module, int after, int dynamic) { /* If after=0 then this is asserta, else it is assertz */ Term *head; @@ -1144,7 +1147,7 @@ assertclause(Term *clause, Module *module, int after) Predicate *p; for(p = module->predicates; p != nil; p = p->next){ if(p->arity == arity && runestrcmp(p->name, name) == 0){ - if(!p->dynamic){ + if(!p->dynamic && dynamic){ Term *t = mkatom(name); t->next = mkinteger(arity); Term *pi = mkcompound(L"/", 2, t); @@ -1163,9 +1166,9 @@ assertclause(Term *clause, Module *module, int after) p->name = name; p->arity = arity; p->clauses = cl; - p->public = 1; + p->public = dynamic; p->builtin = 0; - p->dynamic = 1; + p->dynamic = dynamic; p->next = nil; module->predicates = appendpredicate(p, module->predicates); @@ -1176,14 +1179,21 @@ int builtinasserta(Term *goal, Binding **bindings, Module *module) { USED(bindings); - return assertclause(goal->children, module, 0); + return assertclause(goal->children, module, 0, 1); } int builtinassertz(Term *goal, Binding **bindings, Module *module) { USED(bindings); - return assertclause(goal->children, module, 1); + return assertclause(goal->children, module, 1, 1); +} + +int +builtininsertclause(Term *goal, Binding **bindings, Module *module) +{ + USED(bindings); + return assertclause(goal->children, module, 1, 0); } int @@ -1644,4 +1654,4 @@ builtinnewemptymodule(Term *goal, Binding **bindings, Module *module) Rune *name = goal->children->text; addemptymodule(name); return 1; -}
\ No newline at end of file +} |