| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
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 на
время выполнения реакции на внешнее событие... Или это "другое"?
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |