diff --git a/src/clause_types.rs b/src/clause_types.rs index dc2d01507..abbacbf5c 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -307,6 +307,7 @@ pub enum SystemClauseType { IsSTOEnabled, SetSTOAsUnify, SetNSTOAsUnify, + HomeDirectory, } impl SystemClauseType { @@ -591,6 +592,7 @@ impl SystemClauseType { &SystemClauseType::IsSTOEnabled => clause_name!("$is_sto_enabled"), &SystemClauseType::SetSTOAsUnify => clause_name!("$set_sto_as_unify"), &SystemClauseType::SetNSTOAsUnify => clause_name!("$set_nsto_as_unify"), + &SystemClauseType::HomeDirectory => clause_name!("$home_directory"), } } @@ -839,6 +841,7 @@ impl SystemClauseType { ("$is_sto_enabled", 1) => Some(SystemClauseType::IsSTOEnabled), ("$set_sto_as_unify", 0) => Some(SystemClauseType::SetSTOAsUnify), ("$set_nsto_as_unify", 0) => Some(SystemClauseType::SetNSTOAsUnify), + ("$home_directory", 1) => Some(SystemClauseType::HomeDirectory), _ => None, } } diff --git a/src/machine/mod.rs b/src/machine/mod.rs index b0f607f2e..419401548 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -126,34 +126,6 @@ fn current_dir() -> PathBuf { include!(concat!(env!("OUT_DIR"), "/libraries.rs")); impl Machine { - /* - fn compile_scryerrc(&mut self) { - let mut path = match dirs_next::home_dir() { - Some(path) => path, - None => return, - }; - - path.push(".scryerrc"); - - if path.is_file() { - let file_src = match File::open(&path) { - Ok(file_handle) => Stream::from_file_as_input( - clause_name!(".scryerrc"), - file_handle, - ), - Err(_) => return, - }; - - let rc_src = ListingSource::from_file_and_path( - clause_name!(".scryerrc"), - path.to_path_buf(), - ); - - compile_user_module(self, file_src, rc_src); - } - } - */ - fn run_module_predicate(&mut self, module_name: ClauseName, key: PredicateKey) { if let Some(module) = self.indices.modules.get(&module_name) { if let Some(ref code_index) = module.code_dir.get(&key) { diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 0dacd2aae..bc6724a5f 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -5454,6 +5454,28 @@ impl MachineState { &SystemClauseType::SetNSTOAsUnify => { self.unify_fn = MachineState::unify; } + &SystemClauseType::HomeDirectory => { + let path = match dirs_next::home_dir() { + Some(path) => path, + None => { + self.fail = true; + return Ok(()); + } + }; + + if path.is_dir() { + if let Some(path) = path.to_str() { + let path_atom = self.heap.to_unifiable( + HeapCellValue::Atom(clause_name!(path.to_string(), self.atom_tbl), None), + ); + + (self.unify_fn)(self, self[temp_v!(1)], path_atom); + return return_from_clause!(self.last_call, self); + } + } + + self.fail = true; + } }; return_from_clause!(self.last_call, self) diff --git a/src/toplevel.pl b/src/toplevel.pl index 4a861259c..daf035252 100644 --- a/src/toplevel.pl +++ b/src/toplevel.pl @@ -9,6 +9,13 @@ :- use_module(library('$project_atts')). :- use_module(library('$atts')). +load_scryerrc :- + ( '$home_directory'(HomeDir) -> + atom_concat(HomeDir, '/.scryerrc', ScryerrcFile), + catch(use_module(ScryerrcFile), E, print_exception(E)) + ; true + ). + :- dynamic(argv/1). '$repl'([_|Args0]) :- @@ -19,12 +26,14 @@ ; asserta('$toplevel':argv([])), Args = Args0 ), + load_scryerrc, delegate_task(Args, []), repl. '$repl'(_) :- ( \+ argv(_) -> asserta('$toplevel':argv([])) ; true ), + load_scryerrc, repl. delegate_task([], []).