Страница произведения
Войти
Зарегистрироваться
Страница произведения

Еще одно такое-же типа дополнение к 4й главе


Автор:
Жанр:
Изобретательство
Опубликован:
17.03.2024 — 10.04.2024
Аннотация:
а на само деле результат очередной ревизии кода (самый конец до- и пере-писывается, а остальное - уже вряд ли)
Предыдущая глава  
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава
 
 

выполняющегося оператора сразу же выдаётся на терминал. Это для того чтобы

отследить по какому пути пошло выполнение программы.

Еще, не знаю как в других реализациях (не проверял), но у моего шефа был

отладочный режим (включаемый '??') когда перед выполнением каждого очередного

оператора, интерпретатор ждал нажатия клавиши — команды: выполнить, продолжить

без отладки или остановить. Был так же оператор 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 а так же параметры, передаваемые в

подпрограммы, туда не попадают. Но попадают дополнительные "возвращаемые

Предыдущая глава  
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава



Иные расы и виды существ 11 списков
Ангелы (Произведений: 91)
Оборотни (Произведений: 181)
Орки, гоблины, гномы, назгулы, тролли (Произведений: 41)
Эльфы, эльфы-полукровки, дроу (Произведений: 230)
Привидения, призраки, полтергейсты, духи (Произведений: 74)
Боги, полубоги, божественные сущности (Произведений: 165)
Вампиры (Произведений: 241)
Демоны (Произведений: 265)
Драконы (Произведений: 164)
Особенная раса, вид (созданные автором) (Произведений: 122)
Редкие расы (но не авторские) (Произведений: 107)
Профессии, занятия, стили жизни 8 списков
Внутренний мир человека. Мысли и жизнь 4 списка
Миры фэнтези и фантастики: каноны, апокрифы, смешение жанров 7 списков
О взаимоотношениях 7 списков
Герои 13 списков
Земля 6 списков
Альтернативная история (Произведений: 213)
Аномальные зоны (Произведений: 73)
Городские истории (Произведений: 306)
Исторические фантазии (Произведений: 98)
Постапокалиптика (Произведений: 104)
Стилизации и этнические мотивы (Произведений: 130)
Попадалово 5 списков
Противостояние 9 списков
О чувствах 3 списка
Следующее поколение 4 списка
Детское фэнтези (Произведений: 39)
Для самых маленьких (Произведений: 34)
О животных (Произведений: 48)
Поучительные сказки, притчи (Произведений: 82)
Закрыть
Закрыть
Закрыть
↑ Вверх