Atom(ClauseName),
Char(char),
Number(Number),
- String(Rc<String>),
+ String(TabledRc<String>),
Usize(usize),
EmptyList
}
GetBall,
GetCurrentBlock,
GetCutPoint,
+ GetDoubleQuotes,
InstallNewBlock,
ResetBlock,
SetBall,
SetCutPointByDefault(RegType),
+ SetDoubleQuotes,
SkipMaxList,
Succeed,
UnwindStack
match self {
&SystemClauseType::CheckCutPoint => clause_name!("$check_cp"),
&SystemClauseType::GetBValue => clause_name!("$get_b_value"),
+ &SystemClauseType::GetDoubleQuotes => clause_name!("$get_double_quotes"),
&SystemClauseType::GetSCCCleaner => clause_name!("$get_scc_cleaner"),
&SystemClauseType::InstallSCCCleaner => clause_name!("$install_scc_cleaner"),
&SystemClauseType::InstallInferenceCounter =>
&SystemClauseType::ResetBlock => clause_name!("$reset_block"),
&SystemClauseType::SetBall => clause_name!("$set_ball"),
&SystemClauseType::SetCutPointByDefault(_) => clause_name!("$set_cp_by_default"),
+ &SystemClauseType::SetDoubleQuotes => clause_name!("$set_double_quotes"),
&SystemClauseType::SkipMaxList => clause_name!("$skip_max_list"),
&SystemClauseType::Succeed => clause_name!("$succeed"),
&SystemClauseType::UnwindStack => clause_name!("$unwind_stack"),
match (name, arity) {
("$check_cp", 1) => Some(SystemClauseType::CheckCutPoint),
("$get_b_value", 1) => Some(SystemClauseType::GetBValue),
+ ("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes),
("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner),
("$install_scc_cleaner", 2) =>
Some(SystemClauseType::InstallSCCCleaner),
("$reset_block", 1) => Some(SystemClauseType::ResetBlock),
("$set_ball", 1) => Some(SystemClauseType::SetBall),
("$set_cp_by_default", 1) => Some(SystemClauseType::SetCutPointByDefault(temp_v!(1))),
+ ("$set_double_quotes", 1) => Some(SystemClauseType::SetDoubleQuotes),
("$skip_max_list", 4) => Some(SystemClauseType::SkipMaxList),
("$unwind_stack", 0) => Some(SystemClauseType::UnwindStack),
_ => None
(-)/1, (>=)/2, (=<)/2, (,)/2, (->)/2, (;)/2, (=..)/2, (==)/2,
(\==)/2, (@=<)/2, (@>=)/2, (@<)/2, (@>)/2, (=@=)/2, (\=@=)/2,
(:)/2, call_with_inference_limit/3, catch/3,
+ current_prolog_flag/2, set_prolog_flag/2,
setup_call_cleanup/3, throw/1, true/0, false/0]).
/* this is an implementation specific declarative operator used to implement call_with_inference_limit/3
false :- '$fail'.
+% flags.
+
+current_prolog_flag(Flag, false) :- Flag == bounded, !.
+current_prolog_flag(bounded, false).
+current_prolog_flag(Flag, down) :- Flag == integer_rounding_function, !.
+current_prolog_flag(integer_rounding_function, down).
+current_prolog_flag(Flag, Value) :- Flag == double_quotes, !, '$get_double_quotes'(Value).
+current_prolog_flag(double_quotes, Value) :- '$get_double_quotes'(Value).
+current_prolog_flag(Flag, _) :- Flag == max_integer, !, '$fail'.
+current_prolog_flag(Flag, _) :- Flag == min_integer, !, '$fail'.
+current_prolog_flag(Flag, _) :-
+ atom(Flag),
+ throw(error(domain_error(prolog_flag, Flag), current_prolog_flag/2)). % 8.17.2.3 b
+current_prolog_flag(Flag, _) :-
+ nonvar(Flag),
+ throw(error(type_error(atom, Flag), current_prolog_flag/2)). % 8.17.2.3 a
+
+set_prolog_flag(Flag, Value) :-
+ (var(Flag) ; var(Value)),
+ throw(error(instantiation_error, set_prolog_flag/2)). % 8.17.1.3 a, b
+set_prolog_flag(bounded, false) :- !. % 7.11.1.1
+set_prolog_flag(bounded, true) :- !, '$fail'. % 7.11.1.1
+set_prolog_flag(bounded, Value) :-
+ throw(error(domain_error(flag_value, bounded + Value), set_prolog_flag/2)). % 8.17.1.3 e
+set_prolog_flag(max_integer, Value) :- integer(Value), !, '$fail'. % 7.11.1.2
+set_prolog_flag(max_integer, Value) :-
+ throw(error(domain_error(flag_value, max_integer + Value), set_prolog_flag/2)). % 8.17.1.3 e
+set_prolog_flag(min_integer, Value) :- integer(Value), !, '$fail'. % 7.11.1.3
+set_prolog_flag(min_integer, Value) :-
+ throw(error(domain_error(flag_value, min_integer + Value), set_prolog_flag/2)). % 8.17.1.3 e
+set_prolog_flag(integer_rounding_function, down) :- !. % 7.11.1.4
+set_prolog_flag(integer_rounding_function, Value) :-
+ throw(error(domain_error(flag_value, integer_rounding_function + Value),
+ set_prolog_flag/2)). % 8.17.1.3 e
+set_prolog_flag(double_quotes, chars) :-
+ !, '$set_double_quotes'(chars). % 7.11.2.5, list of one-char atoms.
+set_prolog_flag(double_quotes, atom) :-
+ !, '$set_double_quotes'(atom). % 7.11.2.5, list of one-char atoms.
+set_prolog_flag(double_quotes, Value) :-
+ throw(error(domain_error(flag_value, double_quotes + Value),
+ set_prolog_flag/2)). % 8.17.1.3 e
+set_prolog_flag(Flag, _) :-
+ atom(Flag),
+ throw(error(domain_error(prolog_flag, Flag), set_prolog_flag/2)). % 8.17.1.3 d
+set_prolog_flag(Flag, _) :-
+ throw(error(type_error(atom, Flag), set_prolog_flag/2)). % 8.17.1.3 c
+
% control operators.
','(G1, G2) :- '$get_b_value'(B), ','(G1, G2, B).
_ => self.fail = true
};
},
+ &SystemClauseType::GetDoubleQuotes => {
+ let a1 = self[temp_v!(1)].clone();
+
+ match self.flags.double_quotes {
+ DoubleQuotes::Chars =>
+ self.unify(a1, Addr::Con(atom!("chars"))),
+ DoubleQuotes::Atom =>
+ self.unify(a1, Addr::Con(atom!("atom")))
+ }
+ },
&SystemClauseType::GetSCCCleaner => {
let dest = self[temp_v!(1)].clone();
},
&SystemClauseType::SetCutPointByDefault(r) =>
deref_cut(self, r),
+ &SystemClauseType::SetDoubleQuotes =>
+ match self[temp_v!(1)].clone() {
+ Addr::Con(Constant::Atom(ref atom)) if atom.as_str() == "chars" =>
+ self.flags.double_quotes = DoubleQuotes::Chars,
+ Addr::Con(Constant::Atom(ref atom)) if atom.as_str() == "atom" =>
+ self.flags.double_quotes = DoubleQuotes::Atom,
+ _ => self.fail = true
+ },
&SystemClauseType::InferenceLevel => {
let a1 = self[temp_v!(1)].clone();
let a2 = self.store(self.deref(self[temp_v!(2)].clone()));