]> Repositorios git - scryer-prolog.git/commitdiff
restore .scryerrc loading
authorMark Thom <[email protected]>
Sun, 28 Feb 2021 18:03:55 +0000 (11:03 -0700)
committerMark Thom <[email protected]>
Sun, 28 Feb 2021 18:03:55 +0000 (11:03 -0700)
src/clause_types.rs
src/machine/mod.rs
src/machine/system_calls.rs
src/toplevel.pl

index dc2d015071bfae15c4f7b12eddc54fd15f65fa52..abbacbf5c77e2644fdae2ba942534e7a79211990 100644 (file)
@@ -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,
         }
     }
index b0f607f2e4a9082b97bbf6ebf341de9bddc68e64..4194015485501823dc59a5130a4dd2233e9a9e7d 100644 (file)
@@ -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) {
index 0dacd2aae3b5c08f79cfef4a1503601b2feb7814..bc6724a5f8016dff7627c82af6f6bac98e4a1a2c 100644 (file)
@@ -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)
index 4a861259c482248fb64cef07ff06964ca91921fe..daf035252f1abf9fde8700701c4895acc1ff2164 100644 (file)
@@ -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]) :-
     ;   asserta('$toplevel':argv([])),
         Args = Args0
     ),
+    load_scryerrc,
     delegate_task(Args, []),
     repl.
 '$repl'(_) :-
     (   \+ argv(_) -> asserta('$toplevel':argv([]))
     ;   true
     ),
+    load_scryerrc,
     repl.
 
 delegate_task([], []).