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

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


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

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 : ; < = > ? ASCII

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

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 срочно чинить!

Ищем где. Нашли: фуниция _al_0() в файле Rkd.c — даже две ошибки. Правим.

Смотрим что получилось:

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 [ ] ^ │ Ну вот это совсем

1 │ _ ` 12 13 14 15 16 17 18 0C 0D 1B { | } ~ │ другое дело! Но таки

2 │ ! " # $ % & ' * + . , ( — ) / │ это не совсем то, как

3 │ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? │ задумано. Спрашивается:

└────────────────────────────────────────────────┘ а кавычки нам точно нужны

одна под другой, или и так сойдёт? (Что оно куда ближе к ASCII — хорошо это или

плохо?) Подумаем...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


* * *

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

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

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

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

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

Для этого в Фокал в дополнение к подъязыку арифметических выражений (да,

самых обыкновенных — это тоже своего рода отдельный язык, хотя и простенький)

понадобилось добавить еще три (!) подобных подъязыка: форматные выражения,

регулярные выражения (они же шаблоны, включая и генерирующий) и выражения

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

арифметика неограниченной точности — напрашивается, но так пока и не

реализована.) И пожалуй что злоупотребить словом "форматный"... Однако это же

конструкция "формат" из оператора Type взялась переселяться в другие операторы.

Хотя может кто предложит другое слово — мне вот пока ничего путного на

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

#{...} и ={...} (из языка Си позаимствованный, хотя пожалуй что вскоре

придётся это пересматривать... Тоже кстати отдельный подъязык...)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

получен (вставлен в А2) в виде текста спецоперацией форматного выражения ** и

записан (удалён из А2) с помощью // которые сделаны для отладки, но уж ладно,

пусть будут — мало ли для чего вдруг понадобятся.)

Каждый элемент анализирующего шаблона, сопоставляясь со своим фрагментом

строки, фиксирует в протоколе — с чем именно сопоставился. (Так как

сопоставление идёт методом перебора с возвратами, то при возврате (то есть

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

и дальше пишется поверх...) Так например . (точка) сопоставившись с символом Х

пишет в протокол: ".Х" а встроенный шаблон %ш напишет "шХ"; конструкция <...>

так и пишет в протокол сначала открывающую скобку "<" а когда подойдёт к концу

(то есть удачно отработают все заключенные в ней элементы) — закрывающую ">".

(Напоминаю: весь шаблон целиком — это тоже вот такая конструкция.) Префиксы

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

конце — "|". Выбирающая конструкция [...] пишет в протокол "[" и после неё

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

что он сам туда напишет. (Ну и закрывающую "]" — чисто для красоты.) Встроенный

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

префиксом "U". Есть так же средство записать нечто сложное и громоздкое, с чем

сопоставился например встроенный шаблон %S выделяющий строку в кавычках. А вот

по поводу постфиксов, типа :А где то что сгенерирует это А должно заменить в

протоколе то, что написал туда элемент шаблона этому постфиксу предшествующий,

не реализовано и даже не продумано — пока только общая идея.

Каждый элемент генерирующего шаблона получает очередной элемент протокола и

пытается, если простой, как-то использовать, или, если сложный — распределить

между входящими в него элементами. Так в частности всё та же . (точка)

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

себя — просто игнорирует.

В части второй не решена проблема с передачей в подпрограмму аргумента в

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

подпрограммам — нет? Потому, что тогда под него потребуется локальная

переменная, способная хранить строку. А от полиморфизма мы шарахаемся...

Ладно, предположим это будет регистр форматного механизма с номером,

соответствующим позиции аргумента. А старое его значение — временно где-то

сохраняется и при возврате из подпрограммы будет восстановлено. Но при этом

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

и его пропуск) для каждой позиции. А с другой — в сохранении и последующем

восстановлении нуждается так же и содержимое самого аккумулятора. Хотя не факт.

Но предпринимаются же меры по сохранению и последующему восстановлению А1 на

время выполнения реакции на внешнее событие... Или это "другое"?

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



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