Работа с непечатными символами
Практически у всех, кто знаком со "взрослыми" языками при знакомстве с QPILE обязательно возникает вопрос: каким образом можно задать в тексте программы на QPILE непечатный символ? Если проводить аналогию с языком С и его вариациями, как написать на QPILE конструкцию
Symbol = '\t'
В синтаксисе QPILE такая возможность не заложена. Однако, как обычно, проблему можно решить. И хотя метод не блещет изяществом, работать он будет.
Первое, что приходит в голову, создать в тексте портфеля строку с этими непечатными символами внутри, не обращая внимания н то, что они не отображаются или отображаются как-то странно. Конечно, этот способ в некоторых случаях имеет успех. Например, таким образом можно задать символ табуляции. Предварительно, конечно, необходимо убедиться, что текстовый редактор, в котором вы пишете код пограммы на QPILE, не превратит эту табуляцию в последовательность пробелов. Значительно хуже обстоят дела с другими символами, которые являются непечатными по определению. Нет никакой гарантии, что ваш редактор не сочтёт их "лишними" и сам портфель на QPILE отнесется к такому авангардизму с пониманием. К тому же если даже тот редактор, который Вы пользуете сейчас, проявит благосклонность и оставит все символы на месте, нет никакой гарантии, что какой-нибудь другой, которым Вы воспользуетесь позже, будет столь же политкорректным.
Что делать? Единственный легальный и надежный метод - читать эти символы из файла. Все непечатные символы, которые могут понадобиться в программе на QPILE заранее записываются в файл. Лучше это сделать в редакторе, который имеет режим редактирования в 16-ричном (8-ричном) коде. Однажды перечислив в нем все непечатные символы, больше его никогда не касаемся. Далее в портфеле в момент надобности мы читаем этот файл и получаем строку, в которой перечислены все необходимые нам ранее недоступные символы. функция substr() даст нам требуемый, ведь мы же знаем тот порядок, в котором символы были записаны.
Получается, для того, чтобы получить один символ, мы каждый раз должны лазить на диск и читать файл? А если этот символ нужен 100 раз каждую секунду? Тоже не есть проблема - файл можно прочесть один раз на первой итерации портфеля и положить его в глобальную переменную.
PROGRAM
err = 0
new_global("NonPrintCharacters","");
if NonPrintCharacters == ""
NonPrintCharacters = read_line("chars.txt",1,err)
end if
..... все остальное .................
END_PROGRAM
Таким образом, читаем строчку из файла chars.txt единожды, в последующих итерациях будем пользоваться уже прочитанной. Теперь в любой момент, когда нам потребуется непечатный символ, мы просто получаем его функцией
SingleNonPrintChar = substr(NonPrintCharacters,Index,1)
где Index - это номер нужного нам символа в прочитанной строке. Вот только перевод строки и символ новой строки не удастся так задать - read_line() их вырежет.
Конечно, для уверенности в затрашнем дне нужно проверить функцию read_line() на ошибки. Вдруг враги файл украли или еще что...