Использовать существующий поток clisp

Я новичок в lisp, использую clisp-2.49.

Я пытаюсь написать lisp, чтобы имитировать этот довольно простой кусок bash:

for i in $(program-1)
do
  some-logic
  program-2 $i
done | program-3

Существуют различные способы выполнения программ 1 и 3 (run-program, make-pipe-io-stream и, возможно, другие), каждый из которых оценивает форму и возвращает поток, который я могу использовать. Но для программы-2 мне нужно запустить программу и указать форме использовать поток, который я уже открыл. Я не могу найти формы для этого. Я проглядел что-то очевидное? Есть ли какая-то тонкость, о которой я не знаю?

Большое спасибо, Р.


person Richard    schedule 27.08.2013    source источник


Ответы (1)


Вы можете использовать недокументированную функцию ext::launch. и передать его :output pipe-stream.

Кроме того, вы можете передать весь сценарий оболочки в виде строки EXT:RUN-SHELL-COMMAND.

Однако, вообще говоря, Lisp не предназначен для замены оболочки. Вероятно, вам было бы лучше жонглировать выполнением program-* в оболочке.

person sds    schedule 27.08.2013
comment
Спасибо за ссылку на launch. Я посмотрю поближе. Я не столько рассматривал lisp как оболочку, сколько изучаю язык, мне нужен был простой проект, и преобразование существующего сценария оболочки показалось мне хорошей идеей. Из пропаганды lisp я сделал вывод, что lisp — это гибкий, универсальный язык, который хорошо подходит для решения сложных задач, поэтому я предположил, что, когда я боролся с простой проблемой, ошибка должна быть связана с моими рассуждениями. Еще раз спасибо. - person Richard; 27.08.2013
comment
Спасибо за совет. Было бы справедливо предположить, что у clisp практически нет доступа программиста к низкоуровневым манипуляциям с процессами (fork/exec и т.д.). Что, по-видимому, использует bash в этой ситуации? - person Richard; 27.08.2013
comment
Пожалуйста. Clisp имеет полный доступ к glibc через ffi. ; см. также системные вызовы; см. также ссылку clash в моем ответе. - person sds; 27.08.2013