From 1ce8d9062787bea4532f4cee6e4eb578194fb320 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 17 Mar 2019 14:38:55 -0600 Subject: [PATCH] add halt/0 --- README.md | 1 + src/prolog/clause_types.rs | 3 +++ src/prolog/lib/builtins.pl | 6 ++++-- src/prolog/machine/system_calls.rs | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 007b7edf..4b1a69e6 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ The following predicates are built-in to Scryer. * `gen_nat/1` * `goal_expansion/2` * `ground/1` +* `halt/0` * `integer/1` * `is_list/1` * `is_partial_string/1` diff --git a/src/prolog/clause_types.rs b/src/prolog/clause_types.rs index 8e4ee2a6..dc5f78b5 100644 --- a/src/prolog/clause_types.rs +++ b/src/prolog/clause_types.rs @@ -160,6 +160,7 @@ pub enum SystemClauseType { GetClause, GetCurrentPredicateList, GetModuleClause, + Halt, ModuleHeadIsDynamic, GetLiftedHeapFromOffset, GetLiftedHeapFromOffsetDiff, @@ -234,6 +235,7 @@ impl SystemClauseType { &SystemClauseType::GetDoubleQuotes => clause_name!("$get_double_quotes"), &SystemClauseType::GetModuleClause => clause_name!("$get_module_clause"), &SystemClauseType::GetSCCCleaner => clause_name!("$get_scc_cleaner"), + &SystemClauseType::Halt => clause_name!("$halt"), &SystemClauseType::HeadIsDynamic => clause_name!("$head_is_dynamic"), &SystemClauseType::InstallSCCCleaner => clause_name!("$install_scc_cleaner"), &SystemClauseType::InstallInferenceCounter => clause_name!("$install_inference_counter"), @@ -302,6 +304,7 @@ impl SystemClauseType { ("$get_lh_from_offset_diff", 3) => Some(SystemClauseType::GetLiftedHeapFromOffsetDiff), ("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes), ("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner), + ("$halt", 0) => Some(SystemClauseType::Halt), ("$head_is_dynamic", 1) => Some(SystemClauseType::HeadIsDynamic), ("$install_scc_cleaner", 2) => Some(SystemClauseType::InstallSCCCleaner), ("$install_inference_counter", 3) => Some(SystemClauseType::InstallInferenceCounter), diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index 91b693da..52fd1a7a 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -9,8 +9,8 @@ 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, + expand_goal/2, expand_term/2, findall/3, findall/4, halt/0, + 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]). @@ -753,3 +753,5 @@ reset_global_var_at_key(Key) :- '$reset_global_var_at_key'(Key). bb_get(Key, Value) :- atom(Key), !, '$fetch_global_var'(Key, Value). bb_get(Key, _) :- throw(error(type_error(atom, Key), bb_get/2)). + +halt :- '$halt'. diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index ebce8f23..25ab0fa2 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -628,6 +628,8 @@ impl MachineState { self.fail = true; }, + &SystemClauseType::Halt => + std::process::exit(0), &SystemClauseType::InstallSCCCleaner => { let addr = self[temp_v!(1)].clone(); let b = self.b; -- 2.54.0