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

Фокал - часть 3 (пишется)


Автор:
Опубликован:
24.05.2026 — 04.07.2026
Читателей:
1
Аннотация:
Типа продолжение к "Фокал снаружи и внутри"
Предыдущая глава  
↓ Содержание ↓
  Следующая глава
 
 

операции. Маркер делит строку на три части, условно: A B C — до, под маркером

и после маркера (некоторые из которых могут иметь нулевой размер). Ну так

-*"ххх" вставит ххх перед маркером (т.е. между A и B), +*"ххх" — после маркера

(т.е. между B и C), а просто *"ххх" — вместо маркера (т.е. удалив

предварительно фрагмент B). Но при нулевом размере фрагмента B всё это — без

разницы (во всех трёх случаях вставит между A и C). А вот операция / без

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

удалять, для -/ / +/ удалит части A, B и C соответственно.

Таким образом операции * причитается строчный операнд, / числовой, ~ тоже

числовой, а операциям ^ и $ — не причитаются. И префиксы на них тоже не

действуют. (Не придумал пока, что бы это значило. Хотя есть идеи...)

Разумеется операнд может быть не только константой (это было бы слишком

грустно и не универсально), но и значением переменной: #Х (где Х — буква или

цифра), и результатом вычисления выражения: {...} и даже #{...}.

(Противоположные операции =Х и ={...} тоже очень даже имеют смысл!)

Целая часть числа берется из фокаловской переменной со специфическим именем

#Х, которая, впрочем, от других переменных ничем кроме имени не отличается.

А вот строка (если Х — цифра, так что лучше писать как #N =N) — из "регистра"

форматного механизма. Которых получилось ровно десять штук. И операцией =N

туда же помещается: для -=N =N +=N берутся части строки A B и C соответственно.

Одновременно в фокаловскую переменную с именем #N пишется размер этого

фрагмента. Для -=Х =Х +=Х (где Х — буква) — только размер.

Числовое выражение в {...} отличается от обычного только тем, что там не

должно быть лишних пробелов, и надо по-аккуратней с как раз и заменяющим

пробел символом _ (подчеркивание). А строчное отличается от него тем, что

начинается со строчной константы ("..." ! :N) и единственная операция -

сцепление входящих туда компонентов ("конкатенация"), которая, впрочем, никак

не обозначается — просто перечень компонентов, может быть разделенных

подчеркиваниями (чисто для красоты и наглядности). Понадобилась например на

случай, когда нам нужны все три кавычки: "'` (там это будет {'"'_"'"_"`"}).

Числовые значения, если встретятся, обозначают коды символов. Еще внутри {...}

допускается конструкция =Х — присваивание, но не до, как например в операторе

Set, а ПОСЛЕ того как вычислено то, что хотим присвоить.

#{...} и ={...} — форматные преобразования. (Еще более форматные, чем само

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

форматней уже некуда.) Формат там внутри — позаимствованный у Си-шных функций

printf() и scanf(), да и сами эти конструкции являются их аналогами. (Вот

только о преобразовании в код как-то не. Что то тут недодумано...)

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

по смыслу допустимо "..." может быть не только ! указывающий на А2 но и :цифра

указывающая на один из этих регистров. (Но опять же кроме операторов Ask, Type

и функции FCHr которые и без того со всем этим работают.)

Write Reg; выдаёт текущее содержимое аккумулятора А2 и регистров,

а Eraze Reg; очищает их. (Но вроде бы только со второй очереди?)


* * *

Это была первая очередь форматного механизма оператора Write %

Она включает так же префикс повторения @ для организации циклов и круглые

скобки для группировки операций: префикс повторения (так же как и + -) действует

только на один элемент, но (в отличии от + -) не только на отдельную операцию,

но и вот на такую группу. Например: Write %@(+"Васисуалий"*"Вася").... здесь

все найденные вхождения слова "Васисуалий" будут заменены на слово "Вася", но

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

потому что очереднной поиск слова "Васисуалий" завершится неуспешно и на этом

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

На этот случай есть постфиксы условного выполнения: & ? выполняющие (или

пропускающие) следующую после них операцию для случаев успешности выполнения

предыдущей, неуспешности, а так же ? предусматривающий оба варианта. То есть

например, если в: Write %+"Вася"(^*"###").... фрагмент "Вася" не найден то

выполнение форматного выражения (остаток которого обозначен как ....) всё равно

продолжится. Но строчка без Васи будет помечена в начале символами "###". Если

подобного нам не надо — после можно поставить ничего не делающую "пустую"

операцию _ (подчеркивание).

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

количество повторений, так и заключенный в {} заголовок, аналогичный заголовку

оператора For. Префикс повторения с загловком но без тела цикла вместе с

постфиксом составляет условное выражение.

Кроме того, в первой очереди предусмотрена операция ! для немедленного

прекращения выполнения форматного выражения и одновременно подавления вывода

строки из А2. (В том числе с префиксами + и — "со скандалом": прекращением

работы оператора Write в т.ч. и с ошибкой 3.6 или какой указано), и

противоположная к ней операция . (точка) предписывающая немедленный вывод

строки из А2 (с префиксами — одной из частей строки). Есть даже обращение к

подпрограмме: %Цифра (где цифра указывает один из регистров). Но нету ни

одного встроенного формата, для которых и приберегаются буковки, ни "шаблонов"

(они же "регулярные выражения") в виде конструкции <...> (Вернее шаблоны-то

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

С появлением операции ! устройство NUL более не надобно: Write %! "метка"


* * *

Шаблоны и некоторые встроенные форматы (те самые, для которых мы и

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

можно считать "второй очередью".

Шаблон (он же "регулярное выражение") — конструкция вида <....> так же как

и "....", нужен для поиска фрагмента строки (это — "анализирующий" шаблон),

ну и конешно как правый операнд операции вставки * (звёздочка), указывающий что

именно ей вставлять ("генерирующий"). Шаблон <....> отличается от текстовой

константы "...." тем, что в ней каждый символ изображает самого себя (кроме

ограничивающих конструкцию кавычек, разумеется), а в шаблоне некоторые из

символов имеют специальный смысл. Например . (точка) изображает вовсе не точку

а заменяет собою абсолютно любой символ; ^ и $ — изображают начало и конец

строки в аккумуляторе, а ! (восклицательный знак) — СИМВОЛ конца строки, что

совсем не тоже самое! Да, такой символ УКАЗЫВАЕТ на конец строки; оператор Ask

читая из А2 очередную строку, определяет где у неё конец вот по такому

символу... А состоит он как правило из ДВУХ символов, известных как "перевод

строки" (ПС, он же 'n' в языке Си) и "возврат каретки" (ВК, 'r') с кодами

10 и 13. Именно с этой парой (в любом порядке) ! и сопоставляется. Но так же

если один из них (тоже любой) — в гордом одиночестве. Соответственно, в конце

строки такой "символ" как правило и присутствует. Но совсем не обязательно...

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

Так что <.$.> или <.^.> — заведомо ни с чем не сопоставятся. Потому

что ни до начала строки ни после её конца никаких символов быть не может

просто по определению, а вот <.!.> — очень даже может.

А главный баламут всея Фокала символ % (процент) отбирает у таких вот

специальных символов их специальный смысл, заставляя изображать самоё себя.

Но и придаёт некоторым "обычным" символам специальный смысл "встроенного

шаблона", изображающего собою группу символов. Например: %c — любая цифра,

%b — любая буква, %r — любая русская, %l — любая латинская, а вот %л и %Л

только заглавная и только строчная. Аналогично для русских букв %р %Р и для

букв вообще %б %Б. И кроме того %Г %г %G %g — любой символ псевдографики;

%С %с %S %s — строка в кавычках; %П %п %P %p пробел и "слепые" символы (с

кодом меньше чем у пробела). При чем для %П %п — плюс знаки препинания,

способные завершать слова . , : ; ! ? и конец строки. При чем %П и %P

сопоставляются с одним, а %п и %p — с нулём таких символов, то есть просто

обнаруживают конец слова.

Однако, сила и мощь регулярных выражений — в * ? ("повторение")...

Регулярные выражения встречаются... ну не то что бы сплошь и рядом, но

по-моему достаточно известны — используются при поиске. Чего либо. Например

файлов в каталоге командой операционной системы: DIR имя_файла где вместо

конкретного имени может быть и вот такой шаблон. Где * (звёздочка), которая в

именах файлов не встречается, заменяет собою любое количество любых символов,

в том числе и ни одного, а ? (вопросительный знак) — ровно один символ, но

тоже любой. (В именах файлов ? разумеется тоже не встречается.) Например под

шаблон "*ася" подойдёт и "Вася" и "вася" и "мася" и "ася" и "ЫЫася" и "123ася",

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

Следует заметить, что и в ДОС`е и в винде механизм этот сделан крайне

халтурно. И как он себя поведёт, когда в шаблоне две звёздочки — одному Аллаху

известно.

А вот в UNIX`овском ls — всё по честному. И есть еще один элемент: [...]

заменяющие собой тоже один символ, но не любой, а один из внутри перечисленных.

Или его негативный вариант [~...] — любой из внутри не встречающихся. Внутри

могут быть как сами эти символы, так и "диапазон": чтобы не перечислять все с

подряд идущими кодами. Например: [a-zA-Z] это все латинские буквы. С русскими

буквами такой простой фокус к сожалению не получается. Очень уж от кодировки

зависит...

Но таки в файловых системах вариант регулярных выражений — крайне

упрощенный (можно даже сказать "выхолощенный"). Это как если бы в выражении

арифметическом почему-то нельзя было использовать скобки. И функции. Но ведь

можно же! А здесь у нас этих скобок — аж два вида: <...> и [...]

Кстати, напоминаю: регулярное выражение потому и "шаблон", что

"сопоставляется" с фрагментом строки, определяет — подходит он под него или

нет. Ну так конструкция <...> сопоставляется когда сопоставились все её

элементы, а конструкция [...] — когда один, любой. (Следующие после него даже

и не рассматриваются). А элементом может быть любая конструкция, в том числе и

вот такая. В результате чего они могут вкладываться друг в дружку как матрешки

на любую глубину. Как впрочем и подвыражения в арифметических выражениях...

Повторюсь: главная фенька шаблонов — префиксы повторения! Здесь * и ? не

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

сделать это следующему после них элементу. Так что вместо просто звёздочки

придётся написать *. а *А соответственно сопоставится с любым количеством

букв А идущих подряд — от того места, до куда дошло сопоставление.

Но количество повторений может быть и ограничено: {N} или {N,M} — ровно N,

или >= N но <= M где N и M — фокаловские выражения. Если отсутствуют то для

первого — "от 0", а для второго — "до бесконечности". Так что * это {,} а

? это {,1}. Есть еще + (плюс) эквивалентный {1,} и — (минус) предписывающий

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

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

шаблоне несколько...

Впрочем, хватит и одного. Например в тексте _____аББаБа___ ленивый *-[Ба]Б

выделит только аБ в то время, как жадный *[Ба]Б всё аББаБ целиком.

Среди вышеупомянутых встроенных шаблонов есть так же %Д %В %И %К %У

изображающие заглавные русские буквы в других кодировках и %д %в %и %к %у

изображающие строчные (дД — в ДОС`овской, она же CP-866, вВ — в виндовой, она

же CP-1251, иИ — ИСО-8859.5, кК — КОИ-8 а так же уУ — пресловутый уникод.)

На предмет преобразования символов между кодировками: типа в анализирующем

шаблоне указана одна, а в парном к нему генерирующем — другая. Только русские,

потому, что латинские там везде как в ASCII. (Который содран с давнего

стандарта ISO. А его похоже спёрли у фашистов: климат — великая вещь! Казалось

бы — что такого, подумаешь... А ничего, что в европах даже при ручной обработке

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

для этого надо было десять крестьян? И результаты труда вот этих лишних

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

проедаются... Немцы смогли это грамотно использовать, приняв во всех своих

землях еще аж в конце XVIII века, когда и Германии-то еще небыло, законы об

обязательном всеобщем школьном образовании. Над которыми долго потешались все

остальные европеи. Но лет через сто — к концу XIX века это уже была "страна

хорошистов и отличников". И по очень многим пунктам — "впереди планеты всей".

Вплоть до того, что тогда в мире было две науки: мировая (читай

англо-саксонская) — отсталая, и немецкая — передовая. А Первую Мировую немцы

проиграли (уже практически выигрывая "по очкам") чисто в результате

предательства собственной элиты: договорняка вишь им захотелось... (Нашли с

кем договариваться!) Возвращаясь к нашей теме: еще до Второй Мировой у них

уже была телетайпетная сеть с автоматической коммутацией, сопоставимая по

эффективности с нынешним интернетом. Вот нулевая страница ASCII и заполнена в

основом командами управления этой сетью. Ну и телетайпом немножко. В пятибитном

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

Поэтому и понадобился вот этот вот семибитный. Который потом и превратился в

ASCII...) Так что шаблона %L для них всех вполне достаточно. Вот если и когда

будет какая либо экзотика, типа собственной ("нативной") американской кодировки

с неприличным названием ЕБЗДИК или её вариант с русскими буквами ДКОИ, активно

использовавшийся в серии ЕС-ЭВМ, сдуру содранной с идиотской IBM-360, что,

помнится, еще Дейкстра назвал величайшей победой запада в холодной войне!...

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

кодировками обозначаются теми же самыми буквами. (И тоже только русскими.)

При чем заглавная буква указывает преобразование "на экспорт" — из текущей

кодировки в указанную, а строчная — из указанной в текущую. (Которая — всегда

ДОС`овская.) Преобразуется тот фрагмент строки, что под маркером. Но префиксы

на это тоже действуют.

Из других "встроенных форматов" (кроме перекодировок) пока только R r

123 ... 56789 ... 141516
Предыдущая глава  
↓ Содержание ↓
  Следующая глава



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