paper "Indexing `dif/2`" (_done_).
* All-solutions predicates (`findall/{3,4}`, `bagof/3`, `setof/3`) (_done_).
* Clause creation and destruction (`asserta/1`, `assertz/1`,
- `retract/1`, `abolish/1`) with logical update semantics (_done_).
-* Backtrackable global variables via `bb_get/2` and `bb_put/2` (_done_).
+ `retract/1`, `abolish/1`) with logical update semantics (_done_).
+* Backtrackable and non-backtrackable global variables via `bb_get/2`
+ `bb_put/2` (non-backtrackable) and `b_bb_put/2`
+ (backtrackable). (_done_).
* Streams and predicates for stream control (_in progress_).
* An incremental compacting garbage collector satisfying the five
properties of "Precise Garbage Collection in Prolog."
(>)/2, (<)/2, (=\=)/2, (=:=)/2, (>=)/2, (=<)/2, (,)/2, (->)/2,
(;)/2, (=..)/2, (==)/2, (\==)/2, (@=<)/2, (@>=)/2, (@<)/2,
(@>)/2, (=@=)/2, (\=@=)/2, (:)/2, abolish/1, asserta/1,
- assertz/1, bagof/3, bb_get/2, bb_put/2, call_cleanup/2,
- call_with_inference_limit/3, catch/3, clause/2,
- current_predicate/1, current_prolog_flag/2, expand_goal/2,
- expand_term/2, findall/3, findall/4, once/1, repeat/0,
- retract/1, set_prolog_flag/2, setof/3, setup_call_cleanup/3,
- term_variables/2, throw/1, true/0, false/0, write/1,
- write_canonical/1, writeq/1, write_term/2]).
+ assertz/1, bagof/3, bb_b_put/2, bb_get/2, bb_put/2,
+ call_cleanup/2, call_with_inference_limit/3, catch/3,
+ clause/2, current_predicate/1, current_prolog_flag/2,
+ expand_goal/2, expand_term/2, findall/3, findall/4, once/1,
+ repeat/0, retract/1, set_prolog_flag/2, setof/3,
+ setup_call_cleanup/3, term_variables/2, throw/1, true/0,
+ false/0, write/1, write_canonical/1, writeq/1, write_term/2]).
/* this is an implementation specific declarative operator used to implement call_with_inference_limit/3
and setup_call_cleanup/3. switches to the default trust_me and retry_me_else. Indexing choice
; throw(error(type_error(predicate_indicator, Pred), current_predicate/1))
).
-bb_put(Key, NewValue) :-
+bb_put(Key, Value) :- atom(Key), !, '$store_global_var'(Key, Value).
+bb_put(Key, _) :- throw(error(type_error(atom, Key), bb_put/2)).
+
+bb_b_put(Key, NewValue) :-
( bb_get(Key, OldValue) ->
call_cleanup((store_global_var(Key, NewValue) ; false), store_global_var(Key, OldValue))
; call_cleanup((store_global_var(Key, NewValue) ; false), reset_global_var_at_key(Key))
println!("warning: overwriting {}/{}", &name, arity);
}
- let (p, module_name) = idx.0.borrow().clone();
+ let (p, module_name) = idx.0.borrow().clone();
set_code_index!(code_idx, p, module_name);
return;
}
compile_user_module(self, TERMS.as_bytes());
compile_user_module(self, DCGS.as_bytes());
compile_user_module(self, ATTS.as_bytes());
- compile_user_module(self, ORDSETS.as_bytes());
+ compile_user_module(self, ORDSETS.as_bytes());
compile_user_module(self, DIF.as_bytes());
compile_user_module(self, FREEZE.as_bytes());
compile_user_module(self, REIF.as_bytes());