diff --git a/src/prolog/lib/clpz.pl b/src/prolog/lib/clpz.pl index 61d3e4b6..e4c8e897 100644 --- a/src/prolog/lib/clpz.pl +++ b/src/prolog/lib/clpz.pl @@ -3064,10 +3064,12 @@ is_false(var(X)) :- nonvar(X). :- dynamic(goal_expansion/1). -user:goal_expansion(Goal0, Goal) :- - \+ goal_expansion(false), - clpz_expandable(Goal0), - clpz_expansion(Goal0, Goal). +% goal expansion is disabled for now, until #445 is resolved +% +% user:goal_expansion(Goal0, Goal) :- +% \+ goal_expansion(false), +% clpz_expandable(Goal0), +% clpz_expansion(Goal0, Goal). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/prolog/lib/cont.pl b/src/prolog/lib/cont.pl index 032234e6..8dccdc5e 100644 --- a/src/prolog/lib/cont.pl +++ b/src/prolog/lib/cont.pl @@ -10,7 +10,7 @@ shift(Ball) :- '$nextEP'(first, E, P), get_chunks(E, P, L), ( L == [] -> - Cont = none + Cont = cont(true) ; Cont = cont(call_continuation(L)) ), '$write_cont_and_term'(_, _, Cont, Ball), diff --git a/src/prolog/lib/tabling.pl b/src/prolog/lib/tabling.pl index 153d7f47..8f2b79d2 100644 --- a/src/prolog/lib/tabling.pl +++ b/src/prolog/lib/tabling.pl @@ -136,18 +136,14 @@ activate(Wrapper,Worker,T) :- delim(Wrapper,Worker,Table) :- % debug(tabling, 'ACT: ~p on ~p', [Wrapper, Table]), reset(Worker,SourceCall,Continuation), - ( Continuation == none, var(SourceCall) -> + ( Continuation = none -> ( add_answer(Table,Wrapper) -> true %debug(tabling, 'ADD: ~p', [Wrapper]) ; %debug(tabling, 'DUP: ~p', [Wrapper]), fail ) ; - ( Continuation = cont(Cont) -> - true - ; Continuation = none -> - Cont = true - ), + Continuation = cont(Cont), SourceCall = call_info(_,SourceTable), TargetCall = call_info(Wrapper,Table), Dependency = dependency(SourceCall,Cont,TargetCall), diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 881789ea..4d3bfef6 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -30,33 +30,28 @@ use std::rc::Rc; use std::time::Duration; use cpu_time::ProcessTime; -use crate::crossterm::event::{read, Event, KeyCode, KeyEvent}; +use crate::crossterm::event::{read, Event, KeyCode, KeyEvent, KeyModifiers}; use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode}; -pub fn get_single_char() -> char { - let c; +pub fn get_key() -> KeyEvent { + let key; enable_raw_mode().expect("failed to enable raw mode"); loop { - if let Ok(Event::Key(KeyEvent { code, .. })) = read() { - match code { - KeyCode::Char(ch) => { - c = ch; - break; - }, - KeyCode::Enter => { - c = '\n'; - break; - }, - KeyCode::Tab => { - c = '\t'; - break; - }, - _ => () + let key_ = read(); + if let Ok(key_) = key_ { + if let Event::Key(key_) = key_ { + match key_.code { + KeyCode::Char(_) | KeyCode::Enter | KeyCode::Tab => { + key = key_; + break; + }, + _ => () + } } } } disable_raw_mode().expect("failed to disable raw mode"); - c + key } #[derive(Debug)] @@ -1652,7 +1647,27 @@ impl MachineState { } } &SystemClauseType::GetSingleChar => { - let c = get_single_char(); + let ctrl_c = KeyEvent { + code: KeyCode::Char('c'), + modifiers: KeyModifiers::CONTROL + }; + let key = get_key(); + if key == ctrl_c { + let stub = MachineError::functor_stub( + clause_name!("get_single_char"), + 1 + ); + let err = MachineError::interrupt_error(); + let err = self.error_form(err, stub); + + return Err(err); + } + let c = match key.code { + KeyCode::Enter => '\n', + KeyCode::Tab => '\t', + KeyCode::Char(c) => c, + _ => unreachable!() + }; let a1 = self[temp_v!(1)];