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

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


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

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

путём добавления или удаления вагонов с обоих его концов.

Так, а мы еще не забыли за всеми этими разновсякими операциями — о чем

вообще шла речь?!

А вот о чем: есть у нас в Фокале оператор Write (от слова "врать", откуда

кстати и "врун" и "врач") — ну типа скажи-ка нам что ни будь такое-эдакое...

И правда специализирующийся на сообщении нам разной всякой полезной информации,

начиная от хранящихся в памяти программных строк. При чем в такой форме, чтобы

можно было всё это потом обратно ввести... И вот свалили на него еще и из

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

вящей удобочитаемости. И наобещали наделать для этого встроенных форматов,

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

кодировок, отличных от ДОС`овской — поди прочитай...) Ага-ага: "обещанного три

года ждут"? Если бы только три... Но тем не менее в конце концов... А пока,

чтобы сильно не плакал, сделали ему парочку операций (в виде "форматного

выражения") типа вставить/удалить кусочек строки. А перед этим выделить...

Ну или найти... И вот через некоторое время завелись у нас там "шаблоны" (они

же "регулярные выражения") чтобы указать что ищем — не только константой "...",

но и неким более общим образом. (Впринципе <...> это тоже типа кавычки, только

не "лапки" а "ёлочки"...) А потом, когда наконец появились некоторые из давно

обещанных "встроенных форматов", одному из них (%r — "реверс") поручили

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

А его старший братец %R — сам влез...


* * *

Ну и как же всё это использовать? А вот (уж коли всё это уже реализовано)

давайте нарисуем такие же картинки как выше — для нулевой страницы П-12 и ASCII

а так же для псевдографики. Включая рамочки символами псевдографики. Проверим,

а в самом ли деле оно вот так, как выше расписано?

Если только на экране, то рамочки можно нарисовать функцией FKурсор. Но

если потом надо в файл— придётся это с экрана как то считывать. (Ею же!)

Однако сперва нарисуем циферки сверху и слева, а в качестве "основного

содержимого" ну хотя бы числа — от 0 до 63 (из переменной #k):

4.1 f j=0,15; t %3.2 #k'' %; s #k=#k+1; C одна строка

3.6 s #k=0; f i=0,3; t " "i" "; d 4; t !; C все четыре

3.7 r

Второй % в операторе type восстанавливает нам формат по-умолчанию.

Верхнюю строчку можно-бы выдать сразу целиком — в готовом виде:

3.2 t !!" 0 1 2 3 4 5 6 7 8 9 A B C D E F"!!

Но мы не ищем лёгких путей!

3.2 t !!" "; f i=0,15; w %^__~$__*" "__1__*#{i%x}__. 0

3.3 t !! ; ц 1 2 3 4 5 6 7

Смотрим, что мы сделали. Для наглядности я вставил между отдельными

операция по два ничего не делающих _ (подчеркивания), играющего роль пробела.

И в следующей строке-комментарии пометил операции цифрами. Итак: 1 — поставили

маркер в начало А2 (так как неизвестно, где он был до этого); 2 — сделали,

чтобы всё, что сейчас есть в А2, стало "под маркером" — установили его размер

до конца строки (мало ли что там в А2 осталось с прошлого раза); 3 — заменили

всё это на два пробела; 4 — сдвинули маркер на одну позицию (в результате чего

его размер стал нулевой); 5 — вставили туда то, что нам выдала операция 6,

преобразующая значение переменной i в шестнадцатиричное число (по формату %x);

7 — выдали что получилось в канал вывода.

Теперь нам надо рамочку. Из символов псевдографики. Впринципе не проблема.

Можно в готовом виде:

3.3 t ! " ┌────────────────────────────────────────────────┐"!

3.6 s #k=0; f i=0,3; t % " "i" │"; d 4; t "│"!; C добавили две боковые "│"

3.7 t " └────────────────────────────────────────────────┘"!; r

Или мы опять не ищем лёгких путей?

3.9 f i=0,15; t "───"

3.3 t ! " ┌"; d 3.9; t"┐"!

3.7 t " └"; d 3.9; t"┘"!; r ;C впрочем, эффект совершенно одинаковый...

Этого хватит, или таки продолжим выпендриваться? В смысле рамочку нарисуем

на экране с помощью функции FKурс, вообще-то заведующей перемещением маркера,

но за одно умеющей и это. Вот только надо знать координаты углов на экране.

Хотя бы двух. Сообщить может она-же. И построчно считать, чтобы скопировать с

экрана в файл — тоже она... Нет — пока воздержимся.

Теперь наконец самое интересное, то, ради чего мы всё это затеяли.

Возьмём число из #k (которое, как видим, изменяется от 0 до 63, т.е. в

пределах одной 64-х символьной страницы), преобразуем некоторым образом,

резуьтат поместим в #b. (Для начала — один в один: Set #b=#k;.) И выдадим.

Для непечатного символа (меньше пробела) как число, а для печатного — как

есть. (Меж двух пробелов, потому что под символ у нас — три позиции.)

5.1 i(#b-fchr(' ')) 5.2; t ' ';x fchr(#b); t ' '; r

5.2 t %3.2 #b'' ;

чтобы попробовать — можно и один в один:

4.1 f j=0,15; s #b=#k; d 5; s #k=#k+1;

Но таки хотелось бы чтобы по два символа: не 0 а 00. И шестнадцатиричные.

5.2 t ' '%02.2 #b'' ; C вот это будет по два символа (но пробел — отдельно)

5.2 t ' '; w %^~$*#{#b%02d}. 0; C вот это — должно быть то же самое

5.2 t ' '; w %^~$*#{#b%02x}. 0; C а это — еще и шестнадцатеричное

5.2 t ' '; w %^~$*#{#b%02X}. 0; C а это — еще и чтобы буквы там — заглавные

Ага. А захватим-ка то место, где ДОС`овская псевдографика:

4.1 f j=0,15; s #b=#k+fchr("н"); d 5; s #k=#k+1;

А теперь то же самое с помощью %r (не зря же переменные #k #b, а не k b).

4.1 f j=0,15; w %^%r"#k`н+=b" 0; d 5; s #k=#k+1;

Что видим? 1 2 3 4 5 А вот: 1 — на всякий случай поставили маркер

в начало А2 — чисто для того чтобы размер у него был нулевой — тогда %r

выполнит переданные ему команды (в кавычках) ровно один раз; 2 — положили на

стэк значение переменной #k; 3 — положили на стэк константу — код буквы "н";

4 — сложили; 5 — записали в переменную #b.

И вот теперь, когда наконец всё остальное успешно заработало (не надо

обольщаться — тоже не с первого раза: в любой программе найдётся хотя бы одна

ошибка, даже вот в такусенькой, как у нас — из пары строк)... Вот сейчас

вспомним, какой буковокой обозначается преобразовние из промежуточной

кодировки ну хотя бы в досовскую. Кстати русская заглавная Д. Вот и напишем:

4.1 f j=0,15; w %^%r"#k#l+Д=b" 0; d 5; s #k=#k+1;

А #l у нас будет номер страницы: мы выведем (в файл) все страницы разом

1.1 F l=0,65; t l!; s #l=l*2^6; d 3

o "стр.txt" xw; o x; d 1; q

Что видим? Нулевая страница совершено не такая, как задумано!

0 1 2 3 4 5 6 7 8 9 a b c d e f

┌────────────────────────────────────────────────┐

0 │ 00 @ 02 03 04 05 06 07 08 09 0A 0B C D E F │ получили

1 │ G ` 12 13 14 15 16 17 18 19 1A 1B c d e f │

2 │ ! " # $ % & ' * + . , ( — ) / │

3 │ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? │

└────────────────────────────────────────────────┘

! " # $ % & ' ( ) * + , — . /

0 1 2 3 4 5 6 7 8 9 : ; < = > ? для сравнения

┌────────────────────────────────────────────────┐

0│00 @ /b /c /d ?? ДА a b t n v { | } ^ │ задумано

1│~ ` к1 к2 к3 не ** p ** f r E [ ] ! │

2│пр ' * # $ % & . , ; : + ( — ) / │

3│_ " 0 1 2 3 4 5 6 7 8 9 < = > ? │

└────────────────────────────────────────────────┘

Явно ошибка в программе! Версию 1Б.609910 ред.196 от 09.02.25 срочно чинить!

А псевдографика?

┌────────────────────────────────────────────────┐ вот это получилось

0 │ ─ │ ┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘ K L M ▀ ░ │

1 │ ■ Q ╒ ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛ [ ] ▄ ▒ │

2 │ ` a ╓ ╥ ╖ ╟ ╫ ╢ ╙ ╨ ╜ k l m ▌ ▓ │

3 │ ═ ║ ╔ ╦ ╗ ╠ ╬ ╣ ╚ ╩ ╝ { | } ▐ █ │

└────────────────────────────────────────────────┘

┌────────────────────────────────────────────────┐ а вот так было задумано

0│ ─ │ ┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘ & <— * ▀ ░ │

1│ ■ * ╒ ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛ &  * ▄ ▒ │

2│ ∙ * ╓ ╥ ╖ ╟ ╫ ╢ ╙ ╨ ╜ & -> * ▌ ▓ │

3│ ═ ║ ╔ ╦ ╗ ╠ ╬ ╣ ╚ ╩ ╝ &  * ▐ █ │

└────────────────────────────────────────────────┘

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

Кстати, а как-то узнать об этом можно? Или тоже недоработано?...


* * *

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

наконец то удалось реализовать некоторые средства для работы с текстовыми

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

сосредоточенные преимущественно в подсистеме ввода/вывода, поскольку сами

тексты лежат во внешнем мире в виде файлов. Текстовых...

Для этого к Фокалу пришлось добавить три (!) новых, отдельных, хотя и не

совсем самостоятельных языка: язык форматных выражений, регулярных выражений

(они же шаблоны, включая и генерирующий) и выражений стэковой арифметики.

Правда пока только для целых чисел. (Плавающая арифметика неограниченной

точности — напрашивается, но так пока и не реализована.) Явление, впрочем, не

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

арифметических выражений. В Фокале она простенькая, а вот например в языке Си

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

называемых "функциональных" языках ничего другого в сущности и нет.)

Шарахаемся от полиморфизма, оставив его для третьего Фокала (если и когда

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

у нас же типа произведение искусства! (А вовсе не...) Языков с полиморфизмом

пруд пруди, начиная со всё того же Бейсика. И все они... ну не то что бы

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

немножко разной грамматикой. Мы же решаем вопрос: а есть ли другой принцип,

позволяющий сделать то же самое, но по-другому? А вот оказывается есть!...

Нереализованными остались некоторые из кодировок, например та же ДКОИ или

CP-855 — тоже ДОС`овская, но для братьев-славян — с дополнительными буковками,

несколько потеснившими псевдографику. (И организованная совершенно хаотично!)

Вообще-то их предполагается подгружать по-мере надобности так и не

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

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

латинские под будущие встроенные шаблоны других типов.

Нереализованными остались постфиксы в языке шаблонов, которые бы позволили

некий элемент абстракции. Например сопоставился фрагмент анализирующего шаблона

с некоторой конструкцией, например целым числом, именем переменной или даже с

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

запишет не подробное описание его структуры, как это он сейчас делает, а некий

абстрактный факт, что это "число", "имя", "выражение"...

Да, кстати: проблема генерирующих шаблонов решилась ведением "протокола".

(Который — только один, то есть тоже глобальный, но если что, может быть

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



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