out ... in

Sergey ShishkinSergey Shishkin
4 min read

Сначала хотел выделить только символы с лексемой out, но глядя на output решил объединить с input.

out - открывает any как выходной канал во время выполнения prg. Текущий выходной канал будет сохранен и восстановлен соответствующим образом. Если аргумент равен NIL, используется стандартный вывод. Если аргумент является символом, он используется как имя файла (открывается в режиме чтения/записи-добавления, если первый символ - "+"). Если это положительное число, оно используется как дескриптор открытого файла. Если это отрицательное число, используется сохраненный выходной канал на столько же уровней выше текущего. В противном случае (если это список), он воспринимается как команда с аргументами, и открывается канал для вывода. Код статуса завершения (зависящий от системы) дочернего процесса сохраняется в глобальной переменной @@. Во всех случаях при завершении prg вызывается flush.

(out 'any . prg) -> any

: (out "a" (println 123 '(a b c) 'def))  # Write one line to file "a"
-> def
: (out '(lpr) (prinl "Hello"))  # Send line to line printer
-> "Hello"

output - устанавливает выходной поток, перенаправляя текущий выходной канал во время выполнения prg. Текущий выходной канал будет сохранен и восстановлен соответствующим образом. exe выполняется (в контексте исходного выходного канала) всякий раз, когда требуется вывести символ с помощью вызовов print в prg. Этот символ передается в глобальной переменной @@, а следующий символ в потоке — в @@@ (просмотр вперед на один символ).

(output exe . prg) -> any

: (output (prin (uppc @@)) (prinl "abc"))
ABC
-> "abc"
: (output (println @@ @@@) (prin "abc"))
"a" "b"
"b" "c"
"c" NIL
-> "abc"
: (pack
   (make
      (output (link @@)
         (print '(+ 2 (* 3 4))) ) ) )
-> "(+ 2 (* 3 4))"
: (pack
   (make
      (let L (1 2 3 4 5 6 7)
         (output (link @@)
            (while L
               (ext:Base64 (++ L) (++ L) (++ L)) ) ) ) ) )
-> "AQIDBAUGBw=="

timeout - устанавливает или обновляет значение тайм-аута в глобальном *Run, так что текущий процесс выполняет bye после указанного периода. Если вызывается без аргументов, тайм-аут удаляется. Использует -1 как неявный ключ.

: (timeout 3600000)           # Timeout after one hour
-> (-1 3600000 (bye))
: *Run                        # Look after a few seconds
-> ((-1 3574516 (bye)))

https://picolisp.tiddlyhost.com/#out

in - открывает any входной канал во время выполнения prg. Текущий входной канал будет сохранен и восстановлен соответствующим образом. Если аргумент равен NIL, используется стандартный ввод. Если аргумент является символом, он используется как имя файла (открывается в режиме только для чтения). Если это положительное число, он используется как дескриптор открытого файла. Если это отрицательное число, используется сохраненный входной канал на столько же уровней выше текущего. В противном случае (если это список), он воспринимается как команда с аргументами, и открывается канал для ввода. Код статуса завершения (зависит от системы) дочернего процесса сохраняется в глобальной переменной @@.

(in 'any . prg) -> any

: (in "a" (list (read) (read) (read)))  # Read three items from file "a"
-> (123 (a b c) def)

: (in '(file "-b" "--mime" "bin/picolisp")  # Get the mime type
   (line T) )
-> "application/x-executable; charset=binary"

input - устанавливает входной поток, перенаправляя текущий входной канал во время выполнения prg. Текущий входной канал будет сохранен и восстановлен соответствующим образом. exe выполняется (в контексте исходного входного канала) всякий раз, когда требуется символ для вызовов чтения в prg, и должен возвращать один символ при каждом выполнении.

: (input "A" (char))
-> "A"
: (let L (chop "(+ 2 (* 3 4))")
   (input (++ L) (read)) )
-> (+ 2 (* 3 4))
: (let L (chop "AQIDBAUGBw==")
   (input (++ L)
      (while (ext:Base64)
         (printsp @) ) ) )
1 2 3 4 5 6 7 -> 7

insert - вставляет any в lst а позицию cnt. Это не деструктивная операция

(insert 'cnt 'lst 'any) -> lst

: (insert 3 '(a b c d e) 777)
-> (a b 777 c d e)
: (insert 1 '(a b c d e) 777)
-> (777 a b c d e)
: (insert 9 '(a b c d e) 777)
-> (a b c d e 777)

intern - создает или находит внутренний символ. Если символ с именем any уже интернирован, он возвращается. В противном случае any интернируется в текущее пространство имен и возвращается. Если nsp не является NIL, any всегда интернируется в текущее пространство имен (если nsp — это T) или в заданное пространство имен, даже если он найден в других пространствах имен.

(intern 'any ['nsp]) -> sym

: (intern "abc")
-> abc
: (intern 'car)
-> car
: ((intern "car") (1 2 3))
-> 1
: ((intern '("c" "a" "r")) (1 2 3))
-> 1

https://picolisp.tiddlyhost.com/#in

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

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