task и tasks

task - интерфейс для глобальной переменной *Run. Если вызывается только с одним аргументом num
, соответствующая запись удаляется из значения *Run. В противном случае создается новая запись. Если запись с таким ключом уже существует, выдается ошибка. Для отрицательных чисел необходимо указать второе число. Если указаны аргументы sym/any
, для записи *Run создается среда задания.
(task 'num ['num] [sym 'any ..] [. prg]) -> lst
tasks - запускает задачу с переменной спецификацией события в одной записи *Run. Тело задачи prg
должно возвращать либо положительное число (дескриптор файла), либо отрицательное число (значение тайм-аута) для использования в следующей итерации. Первое значение должно быть тайм-аутом. Значение NIL
удаляет задачу. Использует -2
в качестве неявного ключа.
(tasks . prg)
https://picolisp.tiddlyhost.com/#task
: (task -10000 5000 N 0 (tty (println (inc 'N)))) # Install task for every 10 seconds
-> (-10000 5000 (job '((N . 0)) (tty (println (inc 'N)))))
: 1 # ... after 5 seconds
2 # ... after 10 seconds
3 # ... after 10 seconds
(task -10000) # remove again
-> NIL
: (task (port T 4444) (eval (udp @))) # Receive RPC via UDP
-> (3 (eval (udp @)))
# Another session (on the same machine)
: (udp "localhost" 4444 '(println *Pid)) # Send RPC message
-> (println *Pid)
(tasks # Three iterations with varying timeout
(let X (pop '(((-1000 . a) (-4000 . b) (-1000 . c))))
(tty (println (cdr X)))
(car X) ) )
(tasks
(co 'echoes # Coroutine
(use S
(loop # Loop infinitely
(yield -4000) # First wait 4 seconds
(tty (println 'OK))
(yield # Then wait for remote data
(setq S
(pipe (exec "sh" "-c" "sleep 2; echo 7")) ) )
(tty (println (in S (read))))
(close S) ) ) ) )
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!