add non-backtrackable and backtrackable global variables
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -111,7 +111,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scryer-prolog"
|
name = "scryer-prolog"
|
||||||
version = "0.8.2"
|
version = "0.8.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"downcast 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"downcast 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "scryer-prolog"
|
name = "scryer-prolog"
|
||||||
version = "0.8.2"
|
version = "0.8.3"
|
||||||
authors = ["Mark Thom <markjordanthom@gmail.com>"]
|
authors = ["Mark Thom <markjordanthom@gmail.com>"]
|
||||||
repository = "https://github.com/mthom/scryer-prolog"
|
repository = "https://github.com/mthom/scryer-prolog"
|
||||||
description = "A modern Prolog implementation written mostly in Rust."
|
description = "A modern Prolog implementation written mostly in Rust."
|
||||||
|
|||||||
@@ -47,7 +47,9 @@ Extend Scryer Prolog to include the following, among other features:
|
|||||||
* All-solutions predicates (`findall/{3,4}`, `bagof/3`, `setof/3`) (_done_).
|
* All-solutions predicates (`findall/{3,4}`, `bagof/3`, `setof/3`) (_done_).
|
||||||
* Clause creation and destruction (`asserta/1`, `assertz/1`,
|
* Clause creation and destruction (`asserta/1`, `assertz/1`,
|
||||||
`retract/1`, `abolish/1`) with logical update semantics (_done_).
|
`retract/1`, `abolish/1`) with logical update semantics (_done_).
|
||||||
* Backtrackable global variables via `bb_get/2` and `bb_put/2` (_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_).
|
* Streams and predicates for stream control (_in progress_).
|
||||||
* An incremental compacting garbage collector satisfying the five
|
* An incremental compacting garbage collector satisfying the five
|
||||||
properties of "Precise Garbage Collection in Prolog."
|
properties of "Precise Garbage Collection in Prolog."
|
||||||
|
|||||||
@@ -6,13 +6,13 @@
|
|||||||
(>)/2, (<)/2, (=\=)/2, (=:=)/2, (>=)/2, (=<)/2, (,)/2, (->)/2,
|
(>)/2, (<)/2, (=\=)/2, (=:=)/2, (>=)/2, (=<)/2, (,)/2, (->)/2,
|
||||||
(;)/2, (=..)/2, (==)/2, (\==)/2, (@=<)/2, (@>=)/2, (@<)/2,
|
(;)/2, (=..)/2, (==)/2, (\==)/2, (@=<)/2, (@>=)/2, (@<)/2,
|
||||||
(@>)/2, (=@=)/2, (\=@=)/2, (:)/2, abolish/1, asserta/1,
|
(@>)/2, (=@=)/2, (\=@=)/2, (:)/2, abolish/1, asserta/1,
|
||||||
assertz/1, bagof/3, bb_get/2, bb_put/2, call_cleanup/2,
|
assertz/1, bagof/3, bb_b_put/2, bb_get/2, bb_put/2,
|
||||||
call_with_inference_limit/3, catch/3, clause/2,
|
call_cleanup/2, call_with_inference_limit/3, catch/3,
|
||||||
current_predicate/1, current_prolog_flag/2, expand_goal/2,
|
clause/2, current_predicate/1, current_prolog_flag/2,
|
||||||
expand_term/2, findall/3, findall/4, once/1, repeat/0,
|
expand_goal/2, expand_term/2, findall/3, findall/4, once/1,
|
||||||
retract/1, set_prolog_flag/2, setof/3, setup_call_cleanup/3,
|
repeat/0, retract/1, set_prolog_flag/2, setof/3,
|
||||||
term_variables/2, throw/1, true/0, false/0, write/1,
|
setup_call_cleanup/3, term_variables/2, throw/1, true/0,
|
||||||
write_canonical/1, writeq/1, write_term/2]).
|
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
|
/* 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
|
and setup_call_cleanup/3. switches to the default trust_me and retry_me_else. Indexing choice
|
||||||
@@ -738,7 +738,10 @@ current_predicate(Pred) :-
|
|||||||
; throw(error(type_error(predicate_indicator, Pred), current_predicate/1))
|
; 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) ->
|
( 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), store_global_var(Key, OldValue))
|
||||||
; call_cleanup((store_global_var(Key, NewValue) ; false), reset_global_var_at_key(Key))
|
; call_cleanup((store_global_var(Key, NewValue) ; false), reset_global_var_at_key(Key))
|
||||||
|
|||||||
Reference in New Issue
Block a user