Synchronous concurrency: Difference between revisions

no edit summary
(Added Kotlin)
No edit summary
Line 1,102:
task_yield()
end while</lang>
 
=={{header|Forth}}==
Tested in GForth 0.7.3. First, 'co.fs' - the coroutines library, then the output of the application on himself,
result of the command-line: 'cat synco.fs | gforth synco.fs'.
<lang forth>\
\ co.fs Coroutines by continuations.
\
\ * Circular Queue. Capacity is power of 2.
\
VARIABLE HEAD VARIABLE TAIL
128 CELLS CONSTANT CQ#
\ * align by queue capacity
HERE DUP
CQ# 1- INVERT AND CQ# +
SWAP - ALLOT
\
HERE CQ# ALLOT CONSTANT START
\
: ADJUST ( -- ) [ CQ# 1- ]L AND START + ;
: PUT ( n-- ) TAIL @ TUCK ! CELL+ ADJUST TAIL ! ;
: TAKE ( --n ) HEAD @ DUP @ SWAP CELL+ ADJUST HEAD ! ;
: 0CQ ( -- ) START DUP HEAD ! TAIL ! ; 0CQ
: NOEMPTY? ( --f ) HEAD @ TAIL @ <> ;
: ;CO ( -- ) TAKE >R ;
\
\ * COROUTINES LEXEME
\
: CO: ( -- ) R> PUT ; \ Register continuation as coroutine. Exit.
: CO ( -- ) R> PUT TAKE >R ; \ Co-route.
: GO ( -- ) BEGIN NOEMPTY? WHILE ;CO REPEAT ; \ :-)
\
\ * CHANNELS LEXEME
\
: CHAN? ( a--f ) 2@ XOR ;
</lang>
{{out}}
<pre>
 
\ synco.fs Synchronous concurrency for RosettaCode
include co.fs
 
: STRING@ DUP CELL + SWAP @ ;
 
2VARIABLE CHAN
 
\
\ * READER LEXEME
\
4096 CONSTANT L#
CREATE Line 0 , L# ALLOT
: READER
CO:
BEGIN
Line cell+ L# STDIN read-line THROW
WHILE
Line !
0 Line CHAN 2!
CO
REPEAT DROP
Line DUP CHAN 2!
CO
CR S" -------" TYPE
CR S" LINES: " TYPE CHAN @ ?
;
\
\ * WRITER LEXEME
\
VARIABLE X
: WRITER
CO: 0 X !
BEGIN
CHAN CHAN?
WHILE
CHAN @ STRING@ TYPE CR
1 X +!
CO
REPEAT
0 X CHAN 2!
CO
;
\
\ * RUNNER
\
READER WRITER GO CR BYE
 
-------
LINES: 46
</pre>
 
=={{header|F_Sharp|F#}}==