Это не так безнадежно!Но это не совсем легко.Есть еще два специальных файла, кроме% stdin, из которых вы можете читать.(%lineedit)(r)file dup bytesavailable string readstring pop
будет читать строку из stdin в строку.Существует также файл (%statementedit)
, который будет считываться до тех пор, пока не будет напечатан синтаксически правильный фрагмент постскрипта (плюс перевод строки).Это будет соответствовать круглым скобкам и фигурным скобкам, но не квадратным скобкам.Перед прочтением вам следует ввести приглашение типа (> )print flush
.
Еще одна вещь, которую вы можете поймать ^ D, обернув все это в stopped
контекст.
{ %stopped
(> )print flush
(%lineedit)(r)file
dup bytesavailable string readstring pop
} stopped not {
(successfully read: )print
print
}{
(received EOF indication)print
}ifelse
Вместо того, чтобы выдавать этот bool после readstring, вы можете использовать его для дешевого обнаруженияпустая строка ввода.Также обратите внимание, что остановка, которая срабатывает на EOF, происходит из-за ошибки в file
(ghostscript называет это /invalidfilename
), но хотя file
определен как оператор, и операторы должны перенести свои аргументы обратно в стексообщая об ошибке, я заметил, что ghostscript не обязательно делает это (я забыл, что он оставляет, но это не две строки, как вы ожидаете), поэтому вы можете поместить mark
впереди и cleartomark pop
после всего этого блока.
Специальные файлы (%lineedit)
и (%statementedit)
, если они доступны, будут успешно обрабатывать возвраты, control-U и, возможно, другие элементы управления.Я полагаю, что настоящие принтеры Adobe ответят на ^ T неким сообщением о состоянии.Но я никогда этого не видел.
PS.:!
У меня есть более обширный пример интерактивного postscript в моем postscript отладчике .Вот лучшая версия отладчика , но, вероятно, она менее полезна в качестве примера.