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

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


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

Modify :N = ..... — или в регистр N

Т.е. реализовали все возможные варианты. Что позволяет не только перемещать

программные строки между группами, но использовать некоторые из групп программы

для хранения совершенно "посторонних" строчных значений.

Вообще-то, даже когда формы "с присваиванием" у оператора М еще небыло,

человек, сидящий за терминалом, мог переместить программные строки, например

из одной группы в другую, просто отредактировав номера строк. А вот сама

программа — нет. А форма с текстовым аргументом понадобилась для удобства

работы с отладчиком. (Да и самомодификация...)

Отладочный "ПОШАГОВЫЙ" режим (включающийся по '??') — это когда перед

выполнением каждого очередного оператора, не только выдаётся на терминал

его текст, как при ТРАССИРОВКЕ (включающейся по '?'), но и от человека,

сидящего за терминалом ожидается команда — что делать дальше:

ESC — остановить выполнение программы

ВК (Enter) — выполнить этот оператор, в т.ч. с заходом в подпрограмму

ТАБ — выполнить, но без захода (подпрограмму выполнять "молча")

пробел — продолжить — отмена пошагового режима, трассировка сохраняется

Ctrl/пробел — продолжить без трассировки (то же самое с Sh или Alt)

Этот набор односимвольных команд был дополнен командами:

'?' — выдать мини-справку по этим командам

alt/(PgUp, PgDn, Home, End) — включить/выключить отладочное окно

ЗБ, '*', ':', ';' — ввести и выполнить одну командную строку

(на это время каналы ввода и вывода временно переключаются на клавиатуру и

терминал)

Отладочное окно — чтобы не портить изображение на экране трассировочной и

другой вспомогательной информацией. А командная строка — чтобы можно было

проверить или даже изменить значения переменных, вывести фрагмент программы,

заглянуть в хэлп...

Но это таки отладчик, а не интерфейсная часть интерпретатора — ввод новых

"косвенных" строк (с помещением их в память) не предусмотрен. Однако, М "...";

предоставляет и такую возможность.


* * *

ФОРМАТНОЕ ВЫРАЖЕНИЕ в операторе W %.....

Напоминаю: оператору Write дополнительно поручили копировать строки из

канала ввода в канал вывода. (Через входной буфер оператора Ask, он же

"строчный аккумулятор" или А2.) Возможно, с некоторым преобразованием,

предположительно, в более удобочитаемый вид. Вот форматное выражение и

указывает что с этими строчками делать. Задумывалось что-то типа W %буква.

Каковая буква и обозначает "встроенное преобразование". Но исторически так

сложилось, что буквы эти появились вот можно сказать тока-тока...

В общем: что выросло, то выросло! Получился отдельный от остального Фокала

язык, который здесь и описывается. (Даже два — еще и язык шаблонов.)

Текущая (новая, будем считать что "четвертая") его версия, несколько

отличается от предыдущих. Двумя вещами: упразднена конструкция ? : |

(а '?' стал "постфиксом" как '&' и ''); и поиск теперь — только с префиксом

'+' или '-'. Ну и шаблоны вернулись с реконструкции...

Форматное выражение может быть пустым, тогда оператор копирует строки как

есть. Может начинаться с числа, которое, так же как и в "Ask %NNN", указывает

редактору командной строки ширину поля ввода. W %%... будет воспринято как

"спецформат" (см. выше), что-то там такое устанавливающий.

А вот всё остальное...

Грамматически, всё форматное выражение представляет собой одно "слово",

ограниченное пробелом, запятой или концом оператора, в т.ч. символом ';'.

(Внутри форматного выражения эти символы могут быть только внутри кавычек.)

Логически, форматное выражение это последовательность операций, в том числе

и составных. А синтаксически состоит из буковок, циферок, скобочек ([{<>}]),

значков _+-*/~.!?:|@=#^$%& и уже упоминавшихся кавычек "'` для заключения в

них текстовых констант. (Все кавычки — эквивалентны, а скобки — нет:

используются для разных целей. Вот например круглые заключают в себе составную

операцию...)

Каждая операция в принципе обозначается одним символом. Но вот '=' и '#'

("установить" и "применить") требуют указать что именно устанавливать или

применять. Символ '%' — тоже: он предписывает обращение к чему-то, и нуждается

в указании — к чему именно обратиться. Идущие подряд цифры тоже образуют

единую конструкцию — числовую константу, а символы, заключенные в кавычки -

текстовую (строчную). То и другое может быть как самостоятельной операцией,

так и нет — случись им стоять после операции, нуждающейся в правом операнде вот

такого типа.

Основных операций — всего две: '*' и '/' (вставить и удалить). Вернее даже

три: еще и '_' только она ничего не делает. За то всегда выполняется успешно.

(Хотя пожалуй здесь следовало бы еще упомянуть перемещение маркера и поиск

фрагмента строки.)

Операции выполняются строго слева направо без какого либо старшинства.

Но могут группироваться круглыми скобками: их содержимое считается одной

составной операцией. "+" и "-" считаются "префиксами" — влияют на следующую

после них операцию. "&" и "" считаются "постфиксами" — предписывают

выполнить или пропустить следующую после них операцию в зависимости от

успешности и неуспешности предыдущей. Иначе, при неуспешном выполнении

очередной операции, выполнение форматного выражения сразу же прекращается.

Конструкция ? : | предусматривавшая оба варианта и тоже игравшая роль

скобок в предыдущих версиях — теперь упразднена. Символы ":" и "|"

освободились для других целей, а "?" превратился в постфикс, влияющий на ДВЕ

операции, следующие после него (в том числе составные) — одна обязательно

выполняется а другая пропускается.

"@" — префикс повторения: повторяет следующую после него операцию (чаще всего

составную) либо до первой ошибки, либо так, как предписано "заголовком цикла".

Например: @Y будет раз за разом запускать встроенное преобразование Y пока оно

не вернет признак ошибки. (А так как такого у нас пока нет, то не вернёт

никогда: так и будет каждый раз успешно ничего не делать.) А вот @7+*'/='

вставит /= ровно семь раз; a @{1,22=i}(#i*'-/') вставит -/ с монотонно

увеличивающимся шагом столько, сколько в строке поместится. Но опять же не

более 22 раз. (Обращаться осторожно: зациклить навсегда как нечего делать!)

Операции вставки '*' нужен правый операнд строчного типа, указывающий что

именно вставить (вот как в примерах выше). Иначе она ничего не вставляет.

Операции удаления '/' нужен операнд числового типа, указывающий сколько

символов удалить. При его отсутствии удаляется то, что под маркером. С

префиксами — и + то, что до и после маркера. Операция '*' с префиксами

вставляет свой аргумент перед и после фрагмента, указанного маркером, а без

префиксов — вместо него.

Таким образом МАРКЕР (в качестве которого — указатель, разделяющий "уже

использованную" оператором Ask часть строки в его входном буфере, и "еще нет"),

имеет еще и размер. И указывает не на один символ, а на фрагмент строки.

Изначально, когда строка только введена в А2, маркер ставится в её начало и

указывает её всю. После операции перемещения маркера, его размер становится

нулевой; после операции поиска — устанавливается по размеру найденного; после

вставки — вставленного...

Размер маркера можно принудительно установить с помощью операции '~'

~NN — установить размер маркера = NN (где NN — числовой аргумент)

+~NN -~NN — изменить на NN размер маркера

~$ ~^ — от текущего места и до конца строки, или до её начала

~. — до метки

Операции перемещения маркера:

NN +NN -NN — на NN позиций вперед и назад, в том числе:

0 +0 — на начало и сразу после конца маркера

^ $ — в начало и в конец строки

— + — на одну позицию вперёд и назад

=. #. — установить и применить метку, обменяв её с маркером местами

Операция =. не изменяет состояние маркера, остальные перемещают его, и

делают его размер нулевым.

Таким образом, если префиксу не на что действовать, он становится

самостоятельной операцией. Префикс @ — тоже, вот только не действует он лишь

на постфиксы. Вот и образует с ними условное выражение. Где условие — числовое

выражение в его заголовке: "правда" — если >=0.

Операции поиска: "..." и <...>, теперь обязательно с префиксом '+' или '-'

указывающим направление смещения маркера. Без префикса теперь они только

СОПОСТАВЛЯЮТ своё содержимое с текущим фрагментом строки, не двигая маркер.

(Не сопоставилось — ошибка. Но на этот случай — постфиксы '?' '&' ''.) Вместо

текстовой константы "...", которая сопоставляется на полное совпадение, может

быть любой другой аргумент строчного типа (см. далее). Конструкция <...>

известна как "шаблон" и сопоставляется более сложным образом (тоже см. далее).

Операция 'х' (и Х-русская и ИКС-латинская — они же руна "гебо" из фрутарка

со значением 'братство', 'объединение') предписывает на одну следующую

операцию поиска не различать при сопоставлении строчные и заглавные буквы, а

'Х' (заглавная) — не различать так же русские и латинские.

Числовой аргумент это не только константа в виде последовательности цифр,

но и значение фокаловской переменной со специфическим именем #Б (где Б — любая

буква), или значение выражения, заключенного в фигурные скобки. Например:

123 #А {4*X+5*Y} Запись в переменную #А будет выглядеть как =А

Записывается текущий размер маркера, а с префиксами — размер фрагмента перед и

после него. Используется только целая часть значения переменной или выражения.

Строчный аргумент это не только константа в виде символов, заключенных в

кавычки (любого типа, но одинаковые), но и содержимое одного из "регистров",

предназначенных для временного хранения текстовых фрагментов. А так же

заключенная в фигурные скобки конкатенация (объединение) нескольких текстовых

констант. Числовые значения там тоже допускаются и указывают коды символов.

Например: "абвг" #4 {"деё",Z-6,"жзий"} Запись в регистр #4 будет: =4

Записывается фрагмент под маркером, а с префиксами — перед и после маркера.

Одновременно в переменную с именем #4 записывается размер этого фрагмента.

Именно эти "регистры" и указываются конструкцией :N везде, где допустима

строчная константа. (Кроме операторов ввода/вывода.) В том числе и в

операторе Modify с присваиванием, по любую сторону знака =.

Операции #{...} и ={...} — форматные преобразования числа в строку и

обратно. (Фактически делают то же, что и операторы Type и Ask. Даже в несколько

расширенном варианте.) В фигурных скобках в первом случае выражение

произвольного вида, а во втором — переменная, куда будет записан результат. И

после них может быть % и описание формата в стиле Си-шной функции printf().

А если нету, то используется текущий формат, установленный оператором Type.

Как уже было сказано, форматное выражение выполняется либо до конца, либо

до первой ошибки. (Типа попытки передвинуть маркер за пределы строки.)

Но операция "!" предписывает немедленно завершить выполнение форматного

выражения и подавляет вывод строки. С префиксами: "-!" прекращает работу всего

оператора Write, a "+!" — еще и "со скандалом": порождает ситуацию 3.6 или

указанную числовым аргументом.

Операция "." наоборот предписывает немедленный вывод находящейся в

аккумуляторе строки. С префиксами: "-." — только то, что под маркером, и

"+." — от маркера до конца строки, т.е. "еще неиспользованная" часть.

(Да, несколько нелогично, но так удобнее.)

И наконец конструкция %N или %Б (где N — цифра, а Б — буква) это аналог

обращения к подпрограмме: следующая после неё операция не выполняется, а

рассматривается как "аргумент". Для '%N' — выполняется содержимое регистра N

как форматное выражение. А "аргумент" доступен там как '#%' или '%%'. В первом

случае — как фрагмент строки, а во втором — он выполняется как операция. Для

'%Б' выполняется встроенное (предопределенное) преобразование. От просто 'Б'

оно отличается вот как раз наличием аргумента. И еще тем, что префиксы '-' и

'+' на него не действуют. (Потому что я так и не придумал, как их учесть внутри

подпрограммы '%N'.)


* * *

Встроенные (предопределенные) преобразования можно условно разделить на

"перекодировки" и все остальные.

Из этих самых "остальных" в настоящий момент реализованы только:

'R' — реверс байтов (перестановка их в обратном порядке)

'r' — реверс битов в каждом байте

ну и ранее упоминавшиеся:

'х' и 'Х' — которые сами ничего не делают, но для одной следующей после них

операции поиска (сопоставления) предписывают не различать заглавные и строчные

буквы, а так же русские и латинские.

Они же, но с числовым аргументом ('%хNN' или '%ХNN') указывают с его помощью

разновидность уникода для 'U' (см. ниже).

Перекодировки, т.е. преобразования букв (заглавных / строчных, русских /

латинских) а так же русских букв между разными кодировками — обозначаются

теми же буковками что и для их распознавания в шаблоне (см. далее)

'р' и 'Р' обозначают русские буквы, 'л' и 'Л' — латинские, при чем

'р' и 'л' — строчные, а 'Р' и 'Л' — заглавные. Это относится только к

"текущей" ДОС`овской кодировке CP-866 используемой Фокалом.

Аналогично, для других кодировок заглавные и строчные буквы обозначаются

заглавными и строчными русскими, а латинскими — любые. Кодировки:

'D' 'd' 'Д' 'д' — ДОС (CP-866)

'W' 'w' 'В' 'в' — Win (CP-1251)

'K' 'k' 'К' 'к' — КОИ-8 (ГОСТ-19768.74)

'I' 'i' 'И' 'и' — Исо (ISO 8859.5)

'U' 'u' 'У' 'у' — уникод (по умолчанию utf-8)

Х преобразует буквы из текущей кодировки в кодировку Х

а %XY — из X в Y (где 'X' и 'Y' — любые буквы из вышеперечисленных)

Уникод, как известно, может быть разного типа. Двух и четырёх-байтовый

различаются еще и порядком следования байтов. Различаются они обычно с помощью

символа с кодом 0xFEFF "неразрывный пробел нулевой ширины", который для

этого вставляют самым первым. В анализирующем шаблоне (см. далее) он

распознается с помощью %u, автоматически устанавливающем тип входного уникода.

Но тип уникода может быть так же установлен и принудительно — с помощью

%Хnn, где nn — число (в пределах ста), где единицы указывают тип входного

уникода, а десятки — выходного.

1 — utf-8, 2 — utf-16, 4 — utf-32, — с нормальным порядком байтов

6 -//— 8 -//-, — старшим байтом вперёд (т.е. обратный)

0 — по-умолчанию (для входной — utf-8, а для выходной — как входная).

Для 3 и 7 внезапно получлась трехбайтная кодировка utf-24.


* * *

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



Иные расы и виды существ 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)
Закрыть
Закрыть
Закрыть
↑ Вверх