Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
выполняющегося оператора сразу же выдаётся на терминал. Это для того чтобы
отследить по какому пути пошло выполнение программы.
Еще, не знаю как в других реализациях (не проверял), но у моего шефа был
отладочный режим (включаемый '??') когда перед выполнением каждого очередного
оператора, интерпретатор ждал нажатия клавиши — команды: выполнить, продолжить
без отладки или остановить. Был так же оператор Break для организации реакции
на одно внешнее событие. И несколько противоречащий духу Фокала оператор П,
выделяющий в памяти место под массивы, в т.ч. большого размера (так память
используется куда эффективней: не надо хранить имена и индексы для каждого
элемента).
И ЕЩЕ ПАРА НЮАНСОВ:
— что можно было как-то распечатать не только все хранящиеся в памяти строки,
но и значения сразу всех переменных. (Вроде бы оператором Type с ключевым
словом $.) Сейчас это поручено оператору Write: ему же полагается выдавать
содержимое памяти интерпретатора в форме пригодной для обратного ввода — вот
пусть и сообщает. С ключевым словом Set результаты деятельности этого
оператора по созданию переменных, с ключевым словом Ope — результат
деятельности оператора Operate... и.т.п.
— что если оператор Ask ждёт ввода, а ему вместо числа ввести символ @ то
содержимое переменной, куда идёт ввод — не изменяется. Сейчас для этого еще
можно нажать ESC. (Но это только на клавиатуре, а @ — откуда угодно.)
— что чтобы принудительно остановить работающую программу нужно организовать
какую ни будь ошибку.
Например, если программа к клавиатуре не обращается — два раза нажать на
ней любую кнопку. В результате переполнится буфер клавиатуры. (Который всего
на один символ.) Если-же ввода ожидает оператор Ask — ввести ему некорректное
выражение, злонамеренно допустив в нём любую ошибку: хоть дисбаланс скобок,
хоть несуществующую переменную. А вот если программа сама забирает содержимое
буфера клавиатуры (с помощью FCHR(-1)) то тут ничего не сделаешь: она всяко
делает это быстрее — средства останова должны быть предусмотрены в самой
программе. Впрочем сейчас в этой ситуации можно нажать комбинацию кнопок
Ctrl/C (Ц-латинская), которую отслеживает сам драйвер клавиатуры. (Однако,
сейчас программа может предусмотреть перехват и такой ситуации...)
================
* * *
===============
Это было то, что я называю "базовым" Фокалом.
Реализованная мною версия Фокал-1А (точнее её сокращенный вариант 1Б.6,
о котором собственно и идёт речь) работающая на ПЭВМ IBM-PC под ДОС`ом, это
не то что бы расширение базового, а скорее результат археологических раскопок:
"базовый" это реализация фокаловских принципов по-минимуму, а у меня — как бы
оно должно быть, если по-хорошему. Попытка сделать "то что можно так как нужно"
ничего нового туда не добавляя. Все добавления и расширения (включая
полиморфизм, псевдонимы и другие прелести) отложены до "третьего" Фокала.
(А то "второй" уже был, и по-мне, так получился весьма не очень.) Так что пока
морально готовимся к этому "третьему" и шлифуем "первый"...
Фокал-1А, в точности также как и базовый (который просто Фокал-1,
существовавший, впрочем, в виде множества по-разному называвшихся версий),
работает с одним единственным типом данных — числами с плавающей запятой, и
сохраняет все вышеперечисленные ограничения. Но (кроме дополнительных удобств,
типа редактора командной строки) отличается тем, что в ней с одной стороны не
реализованы операторы Kill и Load, а с другой — дополнительно реализованы:
— средства доступа к файловой системе
— набор "красивостей" (операторы ! Help; ф-ии FКурсор FЦВет FМышь FBip FTMp)
— настоящие локальные переменные (для передачи функции нескольких параметров)
— несколько "улучшенные" операторы For If Go Do Ret Eraze Write Ask Modify
— реакция на (внешние) события и (внутренние) ошибки — оператор Break
— и средства вызывать их искусственно — операторы Kill n; Quit n;
— механизм табулостопов
— и наконец кое что для работы со строками (в т.ч. Write %)
В именах переменных различаются все буквы — и заглавные, и строчные, и
русские, и латинские. А в ключевых словах и именах встроенных функций — нет:
там они эквивалентны. В номерах групп и строк можно использовать не по две,
а до четырех цифр. Текстовая константа выдаётся оператором Type куда угодно,
а оператором Ask — только на терминал. И только в том случае, если ввод — с
клавиатуры, иначе игнорируется. Наличие текстовой константы (в т.ч. и пустой)
подавляет вывод оператором Ask приглашения ":", которое выдаётся тоже только
на терминал. А в операторе Type текстовая константа подавляет вывод пробела,
разделяющего числа, чтобы не сливались.
Ну и комментарий теперь — не только с ключевого слова Coment (фактически с
буквы Ц), но и с не задействованных в языке спецсимволов # $ & : @ | ~
которые, впрочем, все тоже считаются буквами. (Буква вообще всё, что не цифра и
не разделитель.) В UNIX`е первая строчка разрешенного на выполнение текстового
файла должна начинаться с #! после которых — командная строка для sh чтобы
запустить программу-интерпретатор, которая и будет этот файл выполнять. (Если
конечно это не сам sh.) А для самого интерпретатора это должно выглядеть как
комментарий. Вот и. Ну и остальные — до кучи...
* * *
Для ДОСТУПА К ФАЙЛОВОЙ СИСТЕМЕ модернизирован оператор Operate — чтобы он
мог открывать и закрывать файлы, а также передвигать указатель чтения/записи.
А чтобы получить его текущее положение — добавлена ф-я FTEll. Второе ключевое
слово в операторе О теперь "псевдоним" ранее открытого файла.
О "имя_файла" Х — открыть файл под псевдонимом Х
О Х — переключить на него канал ввода или вывода
О (смещение) Х — позиционировать его указатель
О ( ) Х — фиктивная операция (ничего не делает)
О "другое_имя" Х — закрыть файл и открыть другой под тем же псевдонимом
О "" Х — только закрыть
Как именно открыть файл и/или какой канал переключать — указывается
дополнительными буковками второго ключевого слова (которые, в отличии от
других ключевых слов, здесь не все игнорируются): R — на чтение, W — на запись,
А — на добавление (тоже на запись, но в конец файла); T — открыть файл как
текстовый (по умолчанию), B — как бинарный. Буква N при переключении канала
ввода запрещает чистить входной буфер оператора Ask. (Он же строчный
аккумулятор, он же "А2" (для краткости): см. далее.)
Разумеется, файл можно открыть и на чтение и на запись одновременно.
И использовать и для того и для другого попеременно без особых
предосторожностей. Хотя конечно надо иметь в виду, что указатель текущего
места и для того и для другого — общий и автоматически передвигается при
каждой операции. Оператор Ask имеет тенденцию читать за раз целую строку.
А функция FCHR хотя и по одному символу, но прямо из канала ввода только если
входной буфер оператора Ask пуст (иначе оттуда)... А вот открыть можно
по-разному. Если написать: О "файл" Xwr; (т.е. в первую очередь для записи),
то файл становится пустой; а вот если О "файл" Хrw; то его содержимое
сохраняется.
Функция FTEll сообщает информацию о том файле, который участвовал в
последнейпо времени операции ввода/вывода, пусть даже и фиктивной, как О () Х.
Прежде всего конешно положение указателя ввода/вывода.
Но на эту функцию свалили сообщать так же размер файла, сведения о нажатости
"интересных" кнопок (для терминала) и даже искать файлы в текущем каталоге!
(В общем всё, что не знали кому поручить.)
Псевдонимы открытых файлов могут быть на все буквы алфавита, но некоторые
уже задействованы:
— K, T — по прежнему клавиатура и терминал
— I,O,E — стандартный ввод, вывод и вывод ошибок (как в UNIX`e);
— C, L — стандартные компорт и принтер (особенность ДОС`a)
— A, B — псевдонимы двух первых файлов, указанных в командной строке при
запуске Фокала: если они есть, то открываются автоматически (на чтение и
дозапись). И канал ввода устанавливается на А дабы загрузить находящуюся в
этом файле программу. Если их нет, то ищется файл "sav.f" и если найден, тоже
открывается под псевдонимом А. А при выходе из интерпретатора (если сидящий
за терминалом нажал кнопку ESC) — предлагается сохранить программу в этом
файле.
* * *
Всякие КРАСИВОСТИ
Оператор Help выдаёт справки по операторам и встроенным функциям из файла
"foc.hlp" (или "foc-1b.hlp"), который на настоящий момент является основной
документацией к текущей версии. Поэтому выдаваемые им тексты страдают излишней
громоздкостью и многословностью, увы. Но поэтому-же всё что можно подчерпнуть
оттуда — здесь максимально кратко.
Фокал это два файла: собственно интерпретатор foc.exe и вот — файл справки.
Кроме того в файле _fpks.txt, если он есть в текущем каталоге, при завершении
работы интерпретатора сохраняется содержимое пула (мешка) ранее введенных
строк редактора командной строки. А при следующем запуске — загружается
обратно. (А чтобы не в текущем, или другое имя файла — нужна переменная среды
FPKS.) А из файла sav.f, если он есть в текущем каталоге, при запуске
интерпретатора грузится сохранённая в нём прошлый раз программа. Если конечно
имя файла с программой не указано в командной строке. (Первым аргументом.)
Вернее: то или другое, если есть, автоматически открывается под псевдонимом А
и на него переключается канал ввода.
Экранный редактор командной строки (который в принципе тоже "красивость и
удобство"), кроме упомянутого пула ранее введенных строк, имеет "карман" под
фрагмент строки, и дополнительную возможность захватить туда фрагмент с
любого места экрана. Режим работы — только "вставка", режим "замены" не
реализован (как-то вот не понадобился).
Все команды этого редактора (кроме "ввода", "забоя" и "эскейпа") это
кнопки между основной и дополнительной частями клавиатуры: стрелочки и
находящиеся над ними Ins, Home, PageUp,
Del, End, PageDn. А так же их комбинации с кнопками
Sh, Alt и Cntrl.
Редактор позволяет так же включить/выключить "отладочное окно". Это
средство по-возможности не испортить изображение на экране отладочной
информацией — вывод в некоторую ограниченную область экрана (выделенную
рамочкой), содержимое которой на это время сохраняется. Если рамка одинарная,
то перед выполнением каждого очередного оператора отладочное окно убирается с
экрана, а после выполнения — восстанавливается. С тем, чтобы сам оператор и,
возможно, трассировочная информация, были в этом окне, а результат его работы
— на основном экране. (Если рамка двойная — то не убирается.)
Средств переместить отладочное окно или изменить его размер пока нет.
Нормально работает только в текстовом режиме, в графических — крайне медленно.
В общем полезность и целесообразность этого средства — под вопросом.
Оператор ! выполняет команды операционной системы.
Функция FTMp сообщает текущую дату/время в виде количества суток с начала
тысячелетия, а так же преобразует это в удобочитаемый вид и обратно.
Функция FBip издаёт звуки с помощью встроенного в машину динамика, включая
ноты и азбуку морзе.
Функции FЦВет, FViz и FКурсор управляют отображением информации на дисплее.
FЦВет устанавливает цвет выводимых символов (вплоть до редактирования цветовой
палитры); FViz сообщает параметры текущего режима работы, типа количества
строк на экране и символов в строке; FКурсор (она же FCS) не только
перемещает по экрану курсор, но и считывает символ в текущей позиции, а так
же позволяет немножко редактировать содержимое экранного ОЗУ. Включая
изменение цвета знакомест, прокрутку экрана и рисование рамочек символами
псевдографики.
Функция FМышь обслуживает манипулятор мышь — включает/выключает, сообщает
перемещение и нажатость кнопочек. События по манипуляциям с мышью в некой
области экрана заказываются там же где и эта область (окно) — с помощью
функции FViz, а реакция на них устанавливается оператором Break.
Действия, выполняемые перечисленными спецфункциями, определяются видом и
количеством их аргументов (что, впрочем, практиковалось и в базовом Фокале):
аргумент может быть не только числом (вычисляющим его выражением), но и
текстовой константой, а так же может быть пропущен — при условии сохранения
разделяющих аргументы запятых. Кроме того любым функциям причитается
произвольное количество аргументов (в т.ч. и функции FSUbr — см. далее),
лишние просто игнорируются. А если аргумент ровно один, то скобки вокруг него
могут быть опущены.
В отличии от базового Фокала, генератор случайных чисел FRND выдаёт
значения в диапазоне от 0 до 1 (а не от -1 до +1). Функциям FLog FSQrt
(логарифм и корень) второй аргумент указывает степень корня и основание
логарифма. Функция FATan(X,Y) то же самое что FATan(X/Y).
К стандартным математическим функциям добавлены FMIn и FMAx выдающие самый
маленький и самый большой из своих аргументов. Они призваны играть роль
логических операций И и ИЛИ — как для обычной бинарной логики, так и
трёхзначной с нейтральным значением (например нулевым), или вообще нечеткой.
Функция FX, предназначенная для управления внешними устройствами,
обращается только к портам ввода/вывода. (Средств доступа к ОЗУ нет, увы.)
А вот без первого аргумента, указывающего операцию, выполняет побитовые
операции над двоичными числами. Чтобы, например, можно было выделить в наборе
признаков нажатых спец-кнопок клавиатуры те, которые соответствуют кнопке
левый Alt: O () K; S a=FX(,FTEll(),2^9);
Аналогично, функция FSbr без первого аргумента не вызывает никаких
подпрограмм, а сразу возвращает содержимое числового аккумулятора (он же
"А1") — внутренней переменной Фокала, куда попадает результат выражения,
вычисленного в очередном операторе. Но так же и другие полезные вещи...
* * *
АККУМУЛЯТОРНОСТЬ.
Археологические раскопки обнаружили в недрах Фокала два аккумулятора: А1 и
А2, которые были там всегда, но которых почему-то никто не замечал. А третий
(А3) сконденсировался буквально на глазах!
Первый: (А1) "числовой" аккумулятор — вышеупомянутая внутренняя переменная,
куда попадает значение почти любого выражения — чтобы его могла вернуть
"функция определяемая пользователем" FSUBr. Волевым методом решено, что адреса
переходов в операторах Go, Do, If а так же параметры, передаваемые в
подпрограммы, туда не попадают. Но попадают дополнительные "возвращаемые
Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |