make some new process functions
This commit is contained in:
parent
00ebac17ce
commit
90505f89fe
|
@ -1241,14 +1241,22 @@ fn link! {
|
||||||
"Creates a 'hard link' between two processes: if either one dies, they both do."
|
"Creates a 'hard link' between two processes: if either one dies, they both do."
|
||||||
(pid1 as :keyword, pid2 as :keyword) -> link! (pid1, pid2, :report)
|
(pid1 as :keyword, pid2 as :keyword) -> link! (pid1, pid2, :report)
|
||||||
(pid1 as :keyword, pid2 as :keyword, :report) -> base :process (:link_report, pid1, pid2)
|
(pid1 as :keyword, pid2 as :keyword, :report) -> base :process (:link_report, pid1, pid2)
|
||||||
(pid1 as :keyword, pid2 as :keyword, :panic) -> base :process (:link_panic, pid1, pid2)
|
(pid1 as :keyword, pid2 as :keyword, :enforce) -> base :process (:link_enforce, pid1, pid2)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn msgs () -> base :process (:msgs)
|
fn msgs {
|
||||||
|
"Returns the entire contents of the current process as a list. Leaves all messages in the process mailbox."
|
||||||
|
() -> base :process (:msgs)
|
||||||
|
}
|
||||||
|
|
||||||
fn flush! () -> base :process (:flush)
|
fn flush! {
|
||||||
|
"Clears the current process's mailbox."
|
||||||
|
() -> base :process (:flush)}
|
||||||
|
|
||||||
fn sleep! (ms as :number) -> base :process (:sleep, ms)
|
fn sleep! {
|
||||||
|
"Puts the current process to sleep for at least the specified number of milliseconds."
|
||||||
|
(ms as :number) -> base :process (:sleep, ms)
|
||||||
|
}
|
||||||
|
|
||||||
#{
|
#{
|
||||||
self
|
self
|
||||||
|
@ -1256,8 +1264,11 @@ fn sleep! (ms as :number) -> base :process (:sleep, ms)
|
||||||
msgs
|
msgs
|
||||||
spawn!
|
spawn!
|
||||||
yield!
|
yield!
|
||||||
|
|
||||||
alive?
|
alive?
|
||||||
link!
|
link!
|
||||||
|
flush!
|
||||||
|
sleep!
|
||||||
|
|
||||||
abs
|
abs
|
||||||
abs
|
abs
|
||||||
|
|
21
src/vm.rs
21
src/vm.rs
|
@ -289,7 +289,7 @@ impl Creature {
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.send_msg(pid, args[2].clone());
|
.send_msg(pid, args[2].clone());
|
||||||
}
|
}
|
||||||
self.push(Value::Nil);
|
self.push(Value::Keyword("ok"));
|
||||||
}
|
}
|
||||||
"spawn" => {
|
"spawn" => {
|
||||||
println!("spawning new process!");
|
println!("spawning new process!");
|
||||||
|
@ -300,8 +300,25 @@ impl Creature {
|
||||||
}
|
}
|
||||||
"yield" => {
|
"yield" => {
|
||||||
self.r#yield = true;
|
self.r#yield = true;
|
||||||
self.push(Value::Nil);
|
self.push(Value::Keyword("ok"));
|
||||||
}
|
}
|
||||||
|
"alive" => {
|
||||||
|
let Value::Keyword(pid) = args[1].clone() else {
|
||||||
|
unreachable!();
|
||||||
|
};
|
||||||
|
let is_alive = self.zoo.as_ref().borrow().is_alive(pid);
|
||||||
|
if is_alive {
|
||||||
|
self.push(Value::True)
|
||||||
|
} else {
|
||||||
|
self.push(Value::False)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"link" => todo!(),
|
||||||
|
"flush" => {
|
||||||
|
self.mbx = VecDeque::new();
|
||||||
|
self.push(Value::Keyword("ok"));
|
||||||
|
}
|
||||||
|
"sleep" => {}
|
||||||
msg => panic!("Process does not understand message: {msg}"),
|
msg => panic!("Process does not understand message: {msg}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user