a8d0c1a56a
They may take more or less from it (sieve.tlv in particular takes nothing since call depth doesn't help at all there), but what they take is in the right order so that you can compare across apps.
159 lines
5.1 KiB
Lua
159 lines
5.1 KiB
Lua
# .tlv file generated by https://github.com/akkartik/teliva
|
|
# You may edit it if you are careful; however, you may see cryptic errors if you
|
|
# violate Teliva's assumptions.
|
|
#
|
|
# .tlv files are representations of Teliva programs. Teliva programs consist of
|
|
# sequences of definitions. Each definition is a table of key/value pairs. Keys
|
|
# and values are both strings.
|
|
#
|
|
# Lines in .tlv files always follow exactly one of the following forms:
|
|
# - comment lines at the top of the file starting with '#' at column 0
|
|
# - beginnings of definitions starting with '- ' at column 0, followed by a
|
|
# key/value pair
|
|
# - key/value pairs consisting of ' ' at column 0, containing either a
|
|
# spaceless value on the same line, or a multi-line value
|
|
# - multiline values indented by more than 2 spaces, starting with a '>'
|
|
#
|
|
# If these constraints are violated, Teliva may unceremoniously crash. Please
|
|
# report bugs at http://akkartik.name/contact
|
|
- __teliva_timestamp: original
|
|
menu:
|
|
>-- To show app-specific hotkeys in the menu bar, add hotkey/command
|
|
>-- arrays of strings to the menu array.
|
|
>menu = {}
|
|
- __teliva_timestamp: original
|
|
Window:
|
|
>Window = curses.stdscr()
|
|
- __teliva_timestamp: original
|
|
doc:blurb:
|
|
>To show a brief description of the app on the 'big picture' screen, put the text in a special buffer called 'doc:blurb'.
|
|
>
|
|
>You can also override the default big picture screen entirely by creating a buffer called 'doc:main'.
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 21:50:11 2022
|
|
main:
|
|
>function main()
|
|
> local c = task.Channel:new()
|
|
> task.spawn(counter, c)
|
|
> for i=1,10 do
|
|
> print(c:recv())
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 21:50:11 2022
|
|
__teliva_note:
|
|
>a simple counter
|
|
counter:
|
|
>function counter(c)
|
|
> local i = 2
|
|
> while true do
|
|
> c:send(i)
|
|
> i = i+1
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 21:54:53 2022
|
|
filter_task:
|
|
>function filter_task(p, cin, cout)
|
|
> while true do
|
|
> local i = cin:recv()
|
|
> if i%p ~= 0 then
|
|
> cout:send(i)
|
|
> end
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 21:55:46 2022
|
|
main:
|
|
>function main()
|
|
> local primes = task.Channel:new()
|
|
> task.spawn(sieve, primes)
|
|
> for i=1,10 do
|
|
> print(primes:recv())
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 21:59:37 2022
|
|
__teliva_note:
|
|
>filter out multiples of a single number
|
|
sieve:
|
|
>function sieve(ch)
|
|
> local iota = task.Channel:new()
|
|
> task.spawn(counter, iota)
|
|
> task.spawn(filter_task, 2, iota, ch)
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 22:08:07 2022
|
|
__teliva_note:
|
|
>implement the complete sieve algorithm
|
|
sieve:
|
|
>-- Set up a Sieve of Eratosthenes (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)
|
|
>-- for computing prime numbers by chaining tasks, one per prime.
|
|
>-- Each task is responsible for filtering out all multiples of its prime.
|
|
>function sieve(primes_ch)
|
|
> local c = task.Channel:new()
|
|
> task.spawn(counter, c)
|
|
> while true do
|
|
> local p, newc = c:recv(), task.Channel:new()
|
|
> primes_ch:send(p)
|
|
> task.spawn(filter_task, p, c, newc)
|
|
> c = newc
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 22:09:47 2022
|
|
__teliva_note:
|
|
>infinite primes
|
|
main:
|
|
>function main()
|
|
> local primes = task.Channel:new()
|
|
> task.spawn(sieve, primes)
|
|
> while true do
|
|
> Window:addstr(primes:recv())
|
|
> Window:addstr(' ')
|
|
> Window:refresh()
|
|
> end
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 22:09:47 2022
|
|
__teliva_note:
|
|
>clear screen when it fills up; pause on keypress
|
|
>
|
|
>In Teliva getch() implicitly refreshes the screen.
|
|
main:
|
|
>function main()
|
|
> Window:nodelay(true)
|
|
> Window:clear()
|
|
> local primes = task.Channel:new()
|
|
> task.spawn(sieve, primes)
|
|
> local h, w = Window:getmaxyx()
|
|
> while true do
|
|
> Window:addstr(primes:recv())
|
|
> Window:addstr(' ')
|
|
> local c = Window:getch()
|
|
> if c then break end -- key pressed
|
|
> local y, x = Window:getyx()
|
|
> if y > h-1 then
|
|
> Window:clear()
|
|
> end
|
|
> end
|
|
> print('key pressed; done')
|
|
> Window:nodelay(false)
|
|
> Window:getch()
|
|
>end
|
|
- __teliva_timestamp:
|
|
>Sat Feb 26 22:27:25 2022
|
|
doc:blurb:
|
|
>Sieve of Eratosthenes
|
|
>https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
|
|
>
|
|
>A demonstration of tasks and channels, the primitives for (cooperative) concurrency in Teliva.
|
|
>
|
|
>We string together a cascade of tasks connected by channels. Every prime number gets a new task that prints the first incoming number, and then filters out multiples of it from the incoming channel.
|
|
>
|
|
>This approach has the advantage that we don't need to create an array of n numbers to compute primes less than n.
|
|
>
|
|
>However, we still need to create p tasks and p channels if there are p primes less than n. Probably not worth it, given tasks and channels are much larger than numbers. This is just a demo.
|
|
>
|
|
>The noticeable periodic pauses are perhaps due to garbage collection.
|