task и tasks

Sergey ShishkinSergey Shishkin
2 min read

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) ) ) ) )
0
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

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