| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
регистре значения, а аналог действий с железнодорожным составом, формируемым
путём добавления или удаления вагонов с обоих его концов.
Так, а мы еще не забыли за всеми этими разновсякими операциями — о чем
вообще шла речь?!
А вот о чем: есть у нас в Фокале оператор 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 (в виде некоторого описания) и выделять под
них новые буковки — для перекодировок исключительно русские, зарезервировав
латинские под будущие встроенные шаблоны других типов.
Нереализованными остались постфиксы в языке шаблонов, которые бы позволили
некий элемент абстракции. Например сопоставился фрагмент анализирующего шаблона
с некоторой конструкцией, например целым числом, именем переменной или даже с
целым арифметическим выражением, но в протокол для генерирующего шаблона
запишет не подробное описание его структуры, как это он сейчас делает, а некий
абстрактный факт, что это "число", "имя", "выражение"...
Да, кстати: проблема генерирующих шаблонов решилась ведением "протокола".
(Который — только один, то есть тоже глобальный, но если что, может быть
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |