Merge pull request #371 from notoria/sleep

Added the sleep predicate
This commit is contained in:
Mark Thom
2020-04-19 21:41:33 -03:00
committed by GitHub
3 changed files with 48 additions and 20 deletions

View File

@@ -251,6 +251,7 @@ pub enum SystemClauseType {
SetDoubleQuotes,
SetSeed,
SkipMaxList,
Sleep,
Succeed,
TermVariables,
TruncateLiftedHeapTo,
@@ -402,6 +403,7 @@ impl SystemClauseType {
&SystemClauseType::SetCutPointByDefault(_) => clause_name!("$set_cp_by_default"),
&SystemClauseType::SetDoubleQuotes => clause_name!("$set_double_quotes"),
&SystemClauseType::SkipMaxList => clause_name!("$skip_max_list"),
&SystemClauseType::Sleep => clause_name!("$sleep"),
&SystemClauseType::Succeed => clause_name!("$succeed"),
&SystemClauseType::TermVariables => clause_name!("$term_variables"),
&SystemClauseType::TruncateLiftedHeapTo => clause_name!("$truncate_lh_to"),
@@ -525,6 +527,7 @@ impl SystemClauseType {
("$set_double_quotes", 1) => Some(SystemClauseType::SetDoubleQuotes),
("$set_seed", 1) => Some(SystemClauseType::SetSeed),
("$skip_max_list", 4) => Some(SystemClauseType::SkipMaxList),
("$sleep", 1) => Some(SystemClauseType::Sleep),
("$store_global_var", 2) => Some(SystemClauseType::StoreGlobalVar),
("$store_global_var_with_offset", 2) => Some(SystemClauseType::StoreGlobalVarWithOffset),
("$term_variables", 2) => Some(SystemClauseType::TermVariables),

View File

@@ -3,17 +3,26 @@
Part of Scryer Prolog.
This library provides predicates for reasoning about time.
sleep/1 should be implemented here, sleeping for a number of seconds.
In addition, this library should provide reasoning about time stamps.
Reasoning about time stamps would be a useful addition, for example
by obtaining the current time, comparing and formatting it.
'$cpu_new' can be replaced by statistics/2 once that is implemented.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
:- module(time, [time/1]).
:- module(time, [sleep/1, time/1]).
:- use_module(library(format)).
:- use_module(library(iso_ext)).
sleep(T) :-
builtins:must_be_number(T, sleep),
( T < 0 ->
throw(domain_error(not_less_than_zero, T))
; T > 0xfffffffffffffbff ->
throw(domain_error(not_great_than_0xfffffffffffffbff, T))
; '$sleep'(T)
).
time(Goal) :-
'$cpu_now'(T0),
setup_call_cleanup(true,

View File

@@ -3092,6 +3092,22 @@ impl MachineState {
if let Err(err) = self.skip_max_list() {
return Err(err);
},
&SystemClauseType::Sleep => {
let time = self.store(self.deref(self[temp_v!(1)]));
let time = match Number::try_from((time, &self.heap)) {
Ok(Number::Float(OrderedFloat(n))) => n,
Ok(Number::Fixnum(n)) => n as f64,
Ok(Number::Integer(n)) => n.to_f64(),
_ => {
unreachable!()
}
};
let duration = Duration::new(1, 0);
let duration = duration.mul_f64(time);
::std::thread::sleep(duration);
}
&SystemClauseType::StoreGlobalVar => {
let key = self[temp_v!(1)];