FetchGlobalVar,
FetchGlobalVarWithOffset,
GetChar,
+ GetSingleChar,
ResetAttrVarState,
TruncateIfNoLiftedHeapGrowthDiff,
TruncateIfNoLiftedHeapGrowth,
clause_name!("$fetch_global_var_with_offset")
}
&SystemClauseType::GetChar => clause_name!("$get_char"),
+ &SystemClauseType::GetSingleChar => clause_name!("$get_single_char"),
&SystemClauseType::ResetAttrVarState => clause_name!("$reset_attr_var_state"),
&SystemClauseType::TruncateIfNoLiftedHeapGrowth => {
clause_name!("$truncate_if_no_lh_growth")
("$fetch_global_var", 2) => Some(SystemClauseType::FetchGlobalVar),
("$fetch_global_var_with_offset", 3) => Some(SystemClauseType::FetchGlobalVarWithOffset),
("$get_char", 1) => Some(SystemClauseType::GetChar),
+ ("$get_single_char", 1) => Some(SystemClauseType::GetSingleChar),
("$points_to_cont_reset_marker", 1) => {
Some(SystemClauseType::PointsToContinuationResetMarker)
}
current_input/1, current_output/1, current_op/3,
current_predicate/1, current_prolog_flag/2,
expand_goal/2, expand_term/2, fail/0, false/0,
- findall/3, findall/4, get_char/1, halt/0,
- max_arity/1, number_chars/2, number_codes/2,
+ findall/3, findall/4, get_char/1, get_single_char/1,
+ halt/0, max_arity/1, number_chars/2, number_codes/2,
once/1, op/3, read_term/2, repeat/0, retract/1,
set_prolog_flag/2, set_input/1, set_output/1,
setof/3, sub_atom/5, subsumes_term/2,
; throw(error(type_error(in_character, C), get_char/1))
).
+get_single_char(C) :-
+ ( var(C) -> '$get_single_char'(C)
+ ; C == end_of_file -> '$get_single_char'(C)
+ ; atom_length(C, 1) -> '$get_single_char'(C)
+ ; throw(error(type_error(in_character, C), get_char/1))
+ ).
+
can_be_number(N, PI) :-
( var(N) -> true
; must_be_number(N, PI)
}
}
+pub fn get_single_char() -> char {
+ let c;
+ 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;
+ },
+ _ => ()
+ }
+ }
+ }
+ disable_raw_mode().expect("failed to disable raw mode");
+ c
+}
+
struct BrentAlgState {
hare: Addr,
tortoise: Addr,
}
}
}
+ &SystemClauseType::GetSingleChar => {
+ let c = get_single_char();
+
+ let a1 = self[temp_v!(1)];
+
+ self.unify(Addr::Char(c), a1);
+ }
&SystemClauseType::GetModuleClause => {
let module = self[temp_v!(3)];
let head = self[temp_v!(1)];