46 lines
1.1 KiB
Forth
Generated
46 lines
1.1 KiB
Forth
Generated
# example program: communicating between routines using channels
|
|
|
|
def producer sink:&:sink:char -> sink:&:sink:char [
|
|
# produce characters 1 to 5 on a channel
|
|
local-scope
|
|
load-inputs
|
|
# n = 0
|
|
n:char <- copy 0
|
|
{
|
|
done?:bool <- lesser-than n, 5
|
|
break-unless done?
|
|
# other threads might get between these prints
|
|
$print [produce: ], n, [
|
|
]
|
|
sink <- write sink, n
|
|
n <- add n, 1
|
|
loop
|
|
}
|
|
close sink
|
|
]
|
|
|
|
def consumer source:&:source:char -> source:&:source:char [
|
|
# consume and print integers from a channel
|
|
local-scope
|
|
load-inputs
|
|
{
|
|
# read an integer from the channel
|
|
n:char, eof?:bool, source <- read source
|
|
break-if eof?
|
|
# other threads might get between these prints
|
|
$print [consume: ], n:char, [
|
|
]
|
|
loop
|
|
}
|
|
]
|
|
|
|
def main [
|
|
local-scope
|
|
source:&:source:char, sink:&:sink:char <- new-channel 3/capacity
|
|
# create two background 'routines' that communicate by a channel
|
|
routine1:num <- start-running producer, sink
|
|
routine2:num <- start-running consumer, source
|
|
wait-for-routine routine1
|
|
wait-for-routine routine2
|
|
]
|