<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1697779524607396596</id><updated>2012-02-02T11:03:28.954+04:00</updated><category term='linux'/><category term='концепция'/><category term='arm'/><category term='математика'/><category term='разное'/><category term='i386'/><category term='java'/><category term='dembro'/><category term='cygwin'/><category term='проблемы'/><category term='free'/><category term='собственная линейная алгебра'/><category term='lisp'/><category term='forth'/><category term='dpp'/><category term='M4'/><category term='asm'/><category term='delphi'/><category term='разметка'/><category term='pascal'/><category term='tortoisesvn'/><category term='ctags'/><category term='android'/><category term='метапост'/><category term='opengl'/><category term='fpc'/><category term='dquotes'/><category term='unix'/><category term='tf101'/><category term='метапаскаль'/><category term='блог'/><category term='free pascal vs lisp'/><category term='bat'/><category term='windows'/><category term='vim'/><category term='cmd'/><category term='c++'/><category term='события'/><category term='svn'/><title type='text'>Мышь для веселья, клавиатура для боя!</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>90</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3426868888287365984</id><published>2012-02-01T17:19:00.001+04:00</published><updated>2012-02-01T17:55:30.841+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Лисп в первый раз в жизни</title><content type='html'>Вопрос к лисп-аудитории.&lt;br /&gt;&lt;br /&gt;Мне скоро потребуется заменить моего друга на кружке по теории алгоритмов. Рассказывать я могу о чём угодно в течении полутора часов, и я решил рассказать о некоторых философских идеях лиспа для расширения кругозора. Пока что мне приходят в голову две темы для рассказа:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Кодогенерация (макросы, использование программы как данных)&lt;/li&gt;&lt;li&gt;ФП на примере обработки списков (lambda, map, reduce, apply и т.д.) &lt;/li&gt;&lt;/ol&gt;А какие ещё идеи по вашему мнению стоило бы включить в рассказ?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[update] &lt;/b&gt;Если что, то слушатели — десятиклассники, их опыт программирования недалеко выходит за школьный, но есть некоторая стандартная алгоритмическая база.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3426868888287365984?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3426868888287365984/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2012/02/blog-post.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3426868888287365984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3426868888287365984'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2012/02/blog-post.html' title='Лисп в первый раз в жизни'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-548388218786318810</id><published>2011-12-30T00:45:00.001+04:00</published><updated>2011-12-30T00:47:32.790+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tf101'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>ConnectBot</title><content type='html'>&lt;div&gt;&lt;p&gt;&amp;#1042; &amp;#1076;&amp;#1086;&amp;#1075;&amp;#1086;&amp;#1085;&amp;#1082;&amp;#1091; &amp;#1082; &amp;#1084;&amp;#1086;&amp;#1077;&amp;#1084;&amp;#1091; &amp;#1085;&amp;#1077;&amp;#1076;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1084;&amp;#1091; &amp;#1087;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1091; &amp;#1087;&amp;#1088;&amp;#1086; &amp;#1085;&amp;#1072;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1081;&amp;#1082;&amp;#1091; &amp;#1083;&amp;#1080;&amp;#1085;&amp;#1091;&amp;#1082;&amp;#1089;&amp;#1072; &amp;#1087;&amp;#1086;&amp;#1076; &amp;#1072;&amp;#1085;&amp;#1076;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1076;&amp;#1086;&amp;#1084;. &amp;#1042; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1075;&amp;#1088;&amp;#1072;&amp;#1084;&amp;#1084;&amp;#1077; ConnectBot, &amp;#1082;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&amp;#1103; &amp;#1085;&amp;#1091;&amp;#1078;&amp;#1085;&amp;#1072; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1099; &amp;#1095;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1079; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1089;&amp;#1086;&amp;#1083;&amp;#1100;, &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1086; &amp;#1085;&amp;#1072;&amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1080;&amp;#1090;&amp;#1100; Esc &amp;#1085;&amp;#1072; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1096;&amp;#1091; &amp;#1087;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1082;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1086;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1100; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1077;&amp;#1079;&amp;#1085;&amp;#1086;, &amp;#1090;.&amp;#1082;. &amp;#1085;&amp;#1072; &amp;#1076;&amp;#1086;&amp;#1082;. &amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1094;&amp;#1080;&amp;#1080; &amp;#1082; &amp;#1084;&amp;#1086;&amp;#1077;&amp;#1084;&amp;#1091; &amp;#1087;&amp;#1083;&amp;#1072;&amp;#1085;&amp;#1096;&amp;#1077;&amp;#1090;&amp;#1091; &amp;#1085;&amp;#1077;&amp;#1090; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1096;&amp;#1080; Esc. &amp;#1069;&amp;#1090;&amp;#1086; &amp;#1076;&amp;#1072;&amp;#1078;&amp;#1077; &amp;#1091;&amp;#1076;&amp;#1086;&amp;#1073;&amp;#1085;&amp;#1077;&amp;#1077;, &amp;#1095;&amp;#1077;&amp;#1084; &amp;#1077;&amp;#1089;&amp;#1083;&amp;#1080; &amp;#1073;&amp;#1099; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1096;&amp;#1072; Esc &amp;#1073;&amp;#1099;&amp;#1083;&amp;#1072;: &amp;#1086;&amp;#1085;&amp;#1072; &amp;#1074; &amp;#1074;&amp;#1080;&amp;#1084;&amp;#1077; &amp;#1080;&amp;#1089;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1079;&amp;#1091;&amp;#1077;&amp;#1090;&amp;#1089;&amp;#1103; &amp;#1074;&amp;#1077;&amp;#1089;&amp;#1100;&amp;#1084;&amp;#1072; &amp;#1095;&amp;#1072;&amp;#1089;&amp;#1090;&amp;#1086;, &amp;#1080; &amp;#1085;&amp;#1072; &amp;#1086;&amp;#1073;&amp;#1099;&amp;#1095;&amp;#1085;&amp;#1086;&amp;#1081; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1072;&amp;#1090;&amp;#1091;&amp;#1088;&amp;#1077; &amp;#1085;&amp;#1072;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090;&amp;#1089;&amp;#1103; &amp;#1076;&amp;#1072;&amp;#1083;&amp;#1077;&amp;#1082;&amp;#1086; &amp;#1086;&amp;#1090; &amp;#1086;&amp;#1089;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1096;. &amp;#1040; &amp;#1074;&amp;#1086;&amp;#1090; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1096;&amp;#1072; &amp;#1087;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1082; &amp;#1085;&amp;#1072;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090;&amp;#1089;&amp;#1103; &amp;#1089;&amp;#1083;&amp;#1077;&amp;#1074;&amp;#1072; &amp;#1086;&amp;#1090; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1077;&amp;#1083;&amp;#1072;. &amp;#1058;&amp;#1077;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1100; &amp;#1103; &amp;#1076;&amp;#1072;&amp;#1078;&amp;#1077; &amp;#1087;&amp;#1088;&amp;#1080; &amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1077; &amp;#1079;&amp;#1072; &amp;#1086;&amp;#1073;&amp;#1099;&amp;#1095;&amp;#1085;&amp;#1099;&amp;#1084; &amp;#1082;&amp;#1086;&amp;#1084;&amp;#1087;&amp;#1100;&amp;#1102;&amp;#1090;&amp;#1077;&amp;#1088;&amp;#1086;&amp;#1084; &amp;#1080;&amp;#1083;&amp;#1080; &amp;#1085;&amp;#1086;&amp;#1091;&amp;#1090;&amp;#1086;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1080;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1102; &amp;#1082;&amp;#1086;&amp;#1084;&amp;#1073;&amp;#1080;&amp;#1085;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1102; Ctrl+C, &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1084;&amp;#1091; &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1085;&amp;#1077; &amp;#1093;&amp;#1086;&amp;#1095;&amp;#1091; &amp;#1090;&amp;#1103;&amp;#1085;&amp;#1091;&amp;#1090;&amp;#1100;&amp;#1089;&amp;#1103; &amp;#1082; Esc.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-548388218786318810?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/548388218786318810/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/12/connectbot.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/548388218786318810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/548388218786318810'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/12/connectbot.html' title='ConnectBot'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-123227742479538766</id><published>2011-12-15T16:09:00.000+04:00</published><updated>2011-12-15T16:09:12.920+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>DEmbro в unix+ARM окружении!</title><content type='html'>Начал портировать DEmbro на свой планшет :) Сейчас уже запускается, правда, почему-то не хочет исполнять внешние файлы, а без этого туго: дембро при запуске не имеет почти что команд, их нужно &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/core/default/system.de"&gt;подключать конфигурационным файлом&lt;/a&gt;. Вообще, это было плохой идеей, я хотел сделать нечто типа "собери свой форт сам", но лучше это теперь вынести на этап компиляции, потому что тормозит запуск (хочется, чтобы моментально запускался и сразу начинал исполнять, без всяких подготовок). Ну а пока что я могу поиграться, вручную подключив нужный функционал командой builtin :)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Портировал по принципу "что не пашет, то комментирую". Основные проблемы при портировании были из-за разделителя директорий, который отличается в windows и unix, из-за разных символов переносов строк. Из-за того, что ассемблерные вставки для i386 не работают в ARM, и из-за использования windows-специфичных функций серьёзных проблем не возникло. Может быть потому, что я был к этому готов.&lt;br /&gt;&lt;br /&gt;Надо будет как-то получше организовать сборку с учётом платформ и зависимостей, а то сейчас всё в кашу превратилось. Может быть написать систему конфигурации на DEmbro? :) А то как-то лениво изучать существующие.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-123227742479538766?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/123227742479538766/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/12/dembro-unixarm.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/123227742479538766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/123227742479538766'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/12/dembro-unixarm.html' title='DEmbro в unix+ARM окружении!'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7723940360436567102</id><published>2011-12-11T02:37:00.007+04:00</published><updated>2011-12-11T04:08:16.528+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Устанавливаем на планшет Asus Eee Transformer tf101 в дополнение линукс</title><content type='html'>&lt;div&gt;Недавно я стал счастливым обладателем планшета ASUS Eee Transformer tf101 16gb с док-станцией в комплекте и Android в качестве операционной системы. Мне, как программисту, хочется использовать девайс не только для чтения книг и интернета, но и для программирования. Поэтому я решил установить в дополнение к андроиду линукс.&lt;br /&gt;&lt;br /&gt;Первое, что нужно сделать -- получить root-доступ на усройстве. Следует отметить, что это считается взломом, и из-за него может быть отказано в гарантийном обслуживании.&lt;br /&gt;&lt;br /&gt;На нижней стороне устройства находится его серийный номер. Если он начинается на B60 или меньше, то в инете можно найти кучу способов для получения root-доступа. Мне же досталась серия B80, для нее единственный известный способ -- использование программы &lt;a href="http://androidroot.mobi/2011/11/14/introducing-razorclaw-v1/"&gt;Razorclaw&lt;/a&gt;. Программу нужно скачать, установить, запустить, и нажать на единственную в ней кнопку, после чего рут-доступ получен. Возможно, что перед этим потребуется обновить андроид до последней версии (это можно сделать в настройках). &lt;br /&gt;&lt;br /&gt;Ок, после того, как рут-доступ получен, можно приступить к установке линукса. Для этого качаем с маркета программу Linux Installer, документацию для нее смотрите &lt;a href="http://android.galoula.com/en/LinuxInstall"&gt;здесь&lt;/a&gt;. Авторы предупреждают, что неправильное использование программы может привести к порче устройства (если система будет достаточно серьезно повреждена, то восстановить ее не получится, и устройство можно будет выбрасывать). &lt;br /&gt;&lt;br /&gt;Итак, запускаем Linux Installer, открываем в меню Setup. Нужно поменять только один параметр: путь к loop-файлу, я его установил в "/data/Linux.loop". На значение по умолчанию выдавался варнинг о том, что путь вроде как находится на съемном диске (несмотря на то, что это не так). По вкусу я еще поменял hostname и domainname на более короткие и приятные. &lt;br /&gt;&lt;br /&gt;Возвращаемся из Setup, далее действуем по инструкции, которая выводится вверху экрана рядом с пингвином. А именно: жмем create target loop, format target loop, далее идем в Setup, ставим галку около "Allow write to /sys", возвращаемся, жмем mount loop, жмем install distribution in loop. Начались закачивание и установка линукса, нужно подождать какое-то время. Как только это закончилось, жмем Udpate launcher script, теперь для безопасности жмем Stop env loop, заходим в Setup, снимаем галку у "Allow write to /sys", возвращаемся и жмем mount loop. Ок, линукс готов к использованию. &lt;br /&gt;&lt;br /&gt;Теперь нужно установить программу-консоль. У меня клавиатура внешняя (на док-станции) и сильно отличается от того, что обычно бывает на смартфонах, поэтому &lt;a http://code.google.com/p/connectbot/"&gt;стандартный ConnectBot&lt;/a&gt; не подходит. Зато есть &lt;a href="https://github.com/downloads/lorantkurthy/connectbot/ConnectBot.apk"&gt;специальный ConnectBot для именно моего планшета&lt;/a&gt;. Устанавливаем, запускаем. В левом нижнем углу выбираем тип соединения local, вводим какое-нибудь название для сессии (doj, например), жмем Enter. Сейчас мы находимся в псевдолинукс системе самого андроида, в нем мы мало что можем делать. Набираем linuxchroot, должен запуститься установленный ранее линукс с bash в качестве оболочки. &lt;br /&gt;&lt;br /&gt;Устанавливем базовый комплект для программирования, для этого набираем: &lt;br /&gt;apt-get install vim &lt;br /&gt;apt-get install make &lt;br /&gt;apt-get install gcc &lt;br /&gt;apt-get install g++ &lt;br /&gt;&lt;br /&gt;Ок, теперь у нас есть vim (версии 7.2, т.е. со всеми основными вкусностями вима) и компилятор g++. Можем приступить непосредственно к программированию: &lt;br /&gt;mkdir /root/hello &lt;br /&gt;cd /root/hello &lt;br /&gt;vim hello.cpp &lt;br /&gt;&lt;br /&gt;Отмечу на счет вима вот что: на клавиатуре нет клавиши Esc, вместо нее нужно использовать комбинацию Ctrl+C. Набираем минимальную прогу &lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[]) { &lt;br /&gt;&amp;nbsp; printf("Hello from Android!\n"); &lt;br /&gt;&amp;nbsp; return 0; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;Выходим, выполняем &lt;br /&gt;g++ hello.cpp -o hello &lt;br /&gt;./hello &lt;br /&gt;&lt;br /&gt;Видим, что прога работает.  &lt;/stdio.h&gt;&lt;/stdio.h&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7723940360436567102?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7723940360436567102/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/12/asus-eee-transformer-tf101.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7723940360436567102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7723940360436567102'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/12/asus-eee-transformer-tf101.html' title='Устанавливаем на планшет Asus Eee Transformer tf101 в дополнение линукс'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1761972838379040980</id><published>2011-11-23T03:53:00.001+04:00</published><updated>2011-11-23T03:53:58.078+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Меняем шрифты в vim'е</title><content type='html'>Недавно по рекомендации &lt;a href="http://quadengine.blogspot.com/"&gt;Darthman&lt;/a&gt;'а решил сменить используемый шрифт. Всегда раньше использовал &lt;b&gt;FixedSys&lt;/b&gt;, но попробовать другие стало интересно. В посте я попытался описать как настраивать шрифты в виме.&lt;br /&gt;&lt;br /&gt;Если vim запущен в консольном режиме, то отображаемый шрифт полностью зависит от программы-оболочки, реализующей консоль. Поэтому всё, что написано ниже, имеет отношение к gVim'у.&lt;br /&gt;&lt;br /&gt;Опция gVim'а, настраивающая шрифт, называется guifont. Если в качестве параметра ей передать звёздочку, то появится диалоговое окошко (проверено под Windows, в других ОС не гарантируется)&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;:&lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;guifont&lt;/span&gt;=*&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;img src="http://s017.radikal.ru/i429/1111/69/3737e6795a50.png" /&gt;&lt;br /&gt;&lt;br /&gt;Этот способ запуска полезен для перебора разных вариантов, но неудобен для настроек (не поместить в vimrc файл, например). Вместо звёздочки можно передать название шрифта с дополнительными опциями. Вот что написано в хелпе о формате дополнительных опций под windows:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For the Win32 GUI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #323232;"&gt;*&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;E244&lt;/span&gt;&lt;span style="color: #323232;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #323232;"&gt;*&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;E245&lt;/span&gt;&lt;span style="color: #323232;"&gt;*&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- takes these options in the font name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hXX - height is XX (points, can be floating-point)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wXX - width is XX (points, can be floating-point)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;&amp;nbsp; - bold&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&amp;nbsp; - italic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u&amp;nbsp;&amp;nbsp; - underline&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;&amp;nbsp; - strikeout&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cXX - character set XX.&amp;nbsp;&amp;nbsp;Valid charsets are: ANSI, ARABIC,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HANGEUL, HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SYMBOL, THAI, TURKISH, VIETNAMESE ANSI and BALTIC.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Normally you would use "cDEFAULT".&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Use a ':' to separate the options.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- A '_' can be used in the place of a space, so you don't need to use&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;backslashes to escape the spaces.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Examples:&lt;span style="color: #323232;"&gt;&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:set guifont=courier_new:h12:w5:b:cRUSSIAN&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:set guifont=Andale_Mono:h7.5:w4.5&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вот несколько моих примеров со скриншотами:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;guifont&lt;/span&gt;=consolas&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;h11&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;cRUSSIAN&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;img src="http://s008.radikal.ru/i306/1111/76/2e4c15217f5f.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;guifont&lt;/span&gt;=DejaVu_Sans_Mono&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;h11&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;cRUSSIAN&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;img src="http://s45.radikal.ru/i109/1111/3e/f75cacd4e18e.png" /&gt;&lt;br /&gt;&lt;br /&gt;Некий обзор шрифтов для программирования можно почитать &lt;a href="http://habrahabr.ru/blogs/typography/120316/"&gt;в этой статье&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Если не передавать опцию &lt;b&gt;cRUSSIAN&lt;/b&gt;, то могут начаться проблемы с отображением русских букв в разных ситуациях. Если же всё же нет возможности передать такую опцию, то ИМХО самым простым способом решения проблемы является изменение кодировки ввода и языка сообщений:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;guifont&lt;/span&gt;=consolas&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;h11&lt;br /&gt;&lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;encoding&lt;/span&gt;=utf-8&lt;br /&gt;&lt;span style="color: #0087af;"&gt;lan&lt;/span&gt;&amp;nbsp;mes&amp;nbsp;&lt;span style="color: #0087af;"&gt;en&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1761972838379040980?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1761972838379040980/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/11/vim.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1761972838379040980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1761972838379040980'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/11/vim.html' title='Меняем шрифты в vim&apos;е'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3962975392430343481</id><published>2011-11-03T13:08:00.000+04:00</published><updated>2011-11-03T13:08:12.160+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim'у сегодня исполняется ровно 20 лет!</title><content type='html'>А мы с ним одногодки, оказывается :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3962975392430343481?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3962975392430343481/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/11/vim-20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3962975392430343481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3962975392430343481'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/11/vim-20.html' title='Vim&apos;у сегодня исполняется ровно 20 лет!'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2652348813687750995</id><published>2011-10-25T08:59:00.004+04:00</published><updated>2011-10-25T10:19:11.568+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>Язык разметок на DEmbro</title><content type='html'>Я пытаюсь написать свой &lt;a href="http://keyfighter.blogspot.com/2011/06/m4.html"&gt;универсальный язык разметок&lt;/a&gt;. Использование M4 сопровождается множеством неудоств, в частности, долгой отладкой. Из-за этого прогресс с языком разметок немного встал.&lt;br /&gt;&lt;br /&gt;Единый язык разметок удобен тем, что можно писать один текст, и из него генерировать много текстов в различных форматах (html, tex, wiki, simple). В частности, такая возможность мне очень необходима при написании файлов помощи DEmbro — как минимум планируется документация на вики и в REPL режиме.&lt;br /&gt;&lt;br /&gt;Недавно я придумал, как этот язык разметок можно организовать на DEmbro. В качестве основы я взял свои идеи по созданию аналога функции printf в DEmbro, и... реализовал всё самое главное в течении нескольких минут (единственная большая функция занимает 8 строк: &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/tools/doc/core.de"&gt;она тут&lt;/a&gt;). Осталось только написать нужный набор команд, но это не составит труда (пример того, что уже начато для googlecode wiki &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/tools/doc/googlecode.de"&gt;тут&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Опишу идею и её реализацию. Размеченный текст представляет из себя просто обычный текст, в котором иногда встречаются специальные команды, влияющие на отображение этого текста. Почему бы мне не написать команду на DEmbro, которая читает размеченный текст, обычную составляющую просто выводит, а специальные фрагменты выделяет и выполняет их так, как будто это код на DEmbro? Сразу придумался синтаксис: фигурные скобки выделяют в тексте специальные фрагменты. Получается следующее&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;variable&lt;/span&gt;&amp;nbsp;*doing?&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \page&lt;/span&gt;&amp;nbsp;*doing? &lt;span style="color: #87afaf;"&gt;off&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: {page}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*doing? on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;*doing? &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;while&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;{&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;source-cut str.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;}&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;source-cut evaluate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;repeat&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Команда {page} выделяет в цикле фрагменты исходника, зажатые между фигурными скобками, и выполняет их. Команда \page обрывает этот цикл. Как этим пользоваться: допустим, мы хотим добавить в язык разметок команду b для генерации жирного шрифта в формате HTML. Тогда пишем следующее:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: b&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \b&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Разница слешей в последней команде нелепа, но в DEmbro я больше привык закрывающие команды писать именно с таким наклоном, потому что другой «занят» под деление.)&lt;br /&gt;&lt;br /&gt;Теперь можно смело использовать:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; {page}&lt;br /&gt;&amp;nbsp;&amp;nbsp;Это просто текст.&lt;br /&gt;&amp;nbsp;&amp;nbsp;{b}А это уже жирный текст{\b}&lt;br /&gt;{\page}&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;(Это программа на DEmbro, которая выведет текст, преобразованный в html-форматированный.)&lt;br /&gt;&lt;br /&gt;Если есть желание использовать вместо фигурных скобок другие, легко написать другую page-команду, например:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: [page]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*doing? on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;*doing? &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;while&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;[&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;source-cut str.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;]&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;source-cut evaluate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;repeat&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;При этом каким-либо образом переопределять команды \page, b, \b и другие не нужно: можно смело писать&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; [page]&lt;br /&gt;&amp;nbsp;&amp;nbsp;Это просто текст.&lt;br /&gt;&amp;nbsp;&amp;nbsp;[b]А это уже жирный текст[\b]&lt;br /&gt;[\page]&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В зависимости от удобства можно дописать вариант page с любыми ограничителями (не обязательно даже односимвольными).&lt;br /&gt;&lt;br /&gt;Между фигурными/квадратными скобками не обязательно писать лишь одну команду, можно сразу несколько. Например,&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: i&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \i&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: u&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;u&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \u&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;lt;/u&amp;gt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;str. &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;[page]&lt;br /&gt;&amp;nbsp;&amp;nbsp;Это просто текст.&lt;br /&gt;&amp;nbsp;&amp;nbsp;[b i u]А это уже жирный курсивный подчёркнутый текст[\u \i \b]&lt;br /&gt;&amp;nbsp;&amp;nbsp;[b i][u] И это тоже, несмотря на непарность конструкций[\u \i \b]&lt;br /&gt;[\page]&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Более того, т.к. в управляющем коде допустимо писать любой DEmbro-код, можно прямо в нём объявлять команды, переменные, вычислять время и т.д.&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;{page}&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;span style="color: #8700d7;"&gt;: _&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( Тут мы объявили команду, печатающую пробел)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #8700d7;"&gt;: int&lt;/span&gt;&amp;nbsp;int-&amp;gt;str DOC-GENERATOR &amp;lt;&amp;lt; &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( Тут мы объявили команду int, которая печатает число)&lt;/span&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;Значение таймера на момент генерации страницы&lt;span style="color: #8700d7;"&gt;: &lt;/span&gt;&amp;nbsp;{timer int}&lt;br /&gt;&amp;nbsp;&amp;nbsp;Числа от {8 &lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;int} до {0 &lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;int}&lt;span style="color: #8700d7;"&gt;: {&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;swap&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;2dup &lt;span style="color: #0087af;"&gt;&amp;lt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;while&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;int _ &lt;span style="color: #0087af;"&gt;1-&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;repeat&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;execute&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;{\page}&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Последний пример (объявление noname-функции) наталкивает меня на идею компилируемых размеченных текстов. Т.е. сейчас это всё работает только в режиме интерпретации, но, возможно, было бы удобно создавать команды, в которые вкомпилированы генераторы размеченных страниц, зависящие от переданных параметров и окружения.&lt;br /&gt;&lt;br /&gt;В итоге я осознал, что больше не буду использовать M4 в своих разработках (по крайней мере в качестве языка разметок), а буду дальше развивать свой язык разметок (или даже макропроцессор) на DEmbro.&lt;br /&gt;&lt;br /&gt;Пара слов по поводу кода, который находится сейчас среди модулей DEmbro (ссылки были выше). В нём используется та же идея, что описана тут, только слова разложены по пространствам имён, и сделана возможность сменить команду вывода на свою. В будущем конвертирование из моего формата в необходимый будет происходить как-то так:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; HTML &lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;sample.dep&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;evaluate-file &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;br /&gt;TEX &lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;sample.dep&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;evaluate-file &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;br /&gt;GOOGLECODE &lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;sample.dep&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;evaluate-file &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;br /&gt;SIMPLE &lt;span style="color: #0087af;"&gt;" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;sample.dep&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;evaluate-file &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Текущий пример для googlecode можно посмотреть &lt;a href="http://code.google.com/p/dforth/source/browse/tests/doc/gc.de"&gt;тут&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/tests/doc/sample.dep"&gt;sample.dep&lt;/a&gt; -&amp;gt; &lt;a href="http://code.google.com/p/dforth/source/browse/wiki/test.wiki"&gt;test.wiki&lt;/a&gt; -&amp;gt; &lt;a href="http://code.google.com/p/dforth/wiki/test"&gt;так это выглядит в итоге&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2652348813687750995?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2652348813687750995/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/10/dembro_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2652348813687750995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2652348813687750995'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/10/dembro_25.html' title='Язык разметок на DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8615616678617075725</id><published>2011-10-16T06:08:00.001+04:00</published><updated>2011-10-16T06:11:13.506+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Вставка кода с подсветкой в блог при помощи вима</title><content type='html'>Уже не первый год я вставляю сюда фрагменты кода. Для того, чтобы сгенерировать код с подсветкой, я использую команду &lt;span style="font-family: monospace;"&gt;:TOhtml&lt;/span&gt; вима, которая генерирует html-код с подсветкой текущего файла или выделенного фрагмента. Код html появляется в отдельном окне, содержит теги head и body, содержит теги br, которые здесь в блоггере не нужны, содержит кучу лишних переносов строк.&lt;br /&gt;&lt;br /&gt;Поэтому создание кода с подсветкой занимало у меня некоторое время: сгенерировать, выполнить команду для удаления тегов br, удалить ненужные переносы строк, выделить фрагмент html-кода без тегов head, body, скопировать, закрыть окно, и, наконец, вставить html в нужное место.&lt;br /&gt;&lt;br /&gt;Сегодня мне это окончательно надоело, и я автоматизировал этот процесс, сведя всё к одной кнопке.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Собственно, писать особо не о чем, приведу фрагменты кода, которые я разместил в свой _vimrc файл:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0087af;"&gt;fun&lt;/span&gt;! Code&lt;span style="color: #00af87;"&gt;(&lt;/span&gt;line1, line2&lt;span style="color: #00af87;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Исполняем встроенную команду TOhtml&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Она создаст в отдельном окне код html-странички&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;exec&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;a:line1&lt;/span&gt;&lt;span style="color: #0087af;"&gt;.&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;','&lt;/span&gt;&lt;span style="color: #0087af;"&gt;.&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;a:line2&lt;/span&gt;&lt;span style="color: #0087af;"&gt;.&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'TOhtml'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Удаляет всё, что находится выше строки, которая содержит &amp;lt;body&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;g/&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;body/&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;k$dgg&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Хитрое выражение с регуляркой&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Оно обрабатывает содержимое открывающего тега body, извлекает&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" значения параметров bgcolor и text, и заменяет этот тег body&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" на открывающий тег font, в котором в качестве цвета указывается&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" параметр, который находился в параметре text тега body&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;&lt;span style="color: #0087af;"&gt;s&lt;/span&gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&amp;lt;body\s*&lt;span style="color: #00af87;"&gt;\(&lt;/span&gt;bgcolor="\#[a-f0-9]\{6\}"&lt;span style="color: #00af87;"&gt;\)&lt;/span&gt;\s*text=&lt;span style="color: #00af87;"&gt;\(&lt;/span&gt;"\#[a-f0-9]\{6\}"&lt;span style="color: #00af87;"&gt;\)&lt;/span&gt;\s*&amp;gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&amp;lt;font color=&lt;span style="color: #00af87;"&gt;\2&lt;/span&gt;&amp;gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&lt;span style="color: #00af87;"&gt;i&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Заменяет всё, что находится между закрывающим тегом body&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" и закрывающим тегом html, на закрывающий тег font&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;s#&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;/body&lt;span style="color: #0087af;"&gt;&amp;gt;&lt;/span&gt;\&lt;span style="color: #00af87;"&gt;(&lt;/span&gt;&lt;span style="color: #0087af;"&gt;.&lt;/span&gt;\|\n\&lt;span style="color: #00af87;"&gt;)&lt;/span&gt;*&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;/html&lt;span style="color: #0087af;"&gt;&amp;gt;#&amp;lt;&lt;/span&gt;/font&lt;span style="color: #0087af;"&gt;&amp;gt;#&lt;/span&gt;i&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Удаляет все теги br&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;s#&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #0087af;"&gt;&amp;gt;##&lt;/span&gt;i&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Удаляет лишний перенос строки после самой первой строки&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;ggJ&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Удаляет лишний перенос строки перед самой последней строкой&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;GkJ&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Компируем в буфер всё содержимое &lt;/span&gt;&lt;span style="color: #af8700;"&gt;TODO&lt;/span&gt;&lt;span style="color: #8787af;"&gt;: копировать в именованный&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" буфер&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;ggVGy&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Выходим из окна, не сохраняя ничего&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;q&lt;/span&gt;!&lt;br /&gt;&lt;span style="color: #8787af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Вставляем вместо выделенного фрагмента получившийся код&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;gvp&lt;br /&gt;&lt;span style="color: #0087af;"&gt;endf&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Подсветка этого кода сгенерирована им самим же.)&lt;br /&gt;&lt;br /&gt;Добавляем возможность вызова команды для выделенного промежутка строк:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0087af;"&gt;command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;-&lt;/span&gt;&lt;span style="color: #8700d7;"&gt;range&lt;/span&gt;&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;&lt;span style="color: #87af87;"&gt;%&lt;/span&gt;&amp;nbsp;Code&amp;nbsp;&lt;span style="color: #0087af;"&gt;:&lt;/span&gt;call&amp;nbsp;&lt;span style="background-color: black;"&gt;&lt;span style="color: #a8a8a8;"&gt;Code&lt;/span&gt;&lt;/span&gt;(&lt;span style="color: #00af87;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;line1&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;gt;&lt;/span&gt;,&lt;span style="color: #00af87;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;line2&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;gt;&lt;/span&gt;)&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Наконец, вешаем всё это на клавишу &lt;span highlight="Search"&gt;F4&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #0087af;"&gt;vmap&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&lt;span highlight="Search"&gt;F4&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;:Code&lt;span style="color: #00af87;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;CR&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Как этим пользоваться: выделяем фрагмент кода, подсветку которого хотим сделать, жмём &lt;span highlight="Search"&gt;F4&lt;/span&gt;, и вуаля! Вместо фрагмента кода появляется html-код с подсветкой.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Чтобы проще было разобраться как работают команды внутри функции Code, опишу как можно выполнить эту функцию вручную и пошагово. Пусть у нас есть код, подсветку которого хочется сделать:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;:a CreateWindowExA&lt;/span&gt;&amp;nbsp;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG LONG HWND HMENU HINST LPVOID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HWND &lt;span style="color: #8700d7;"&gt;user32;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:a DefWindowProcA&lt;/span&gt;&amp;nbsp;HWND UINT WPARAM LPARAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LRESULT &lt;span style="color: #8700d7;"&gt;user32;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:a DestroyWindow&lt;/span&gt;&amp;nbsp;HWND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL &lt;span style="color: #8700d7;"&gt;user32;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:a DispatchMessageA&lt;/span&gt;&amp;nbsp;LPMSG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG &lt;span style="color: #8700d7;"&gt;user32;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Выделяем его при помощи &lt;b&gt;shift+v&lt;/b&gt; (в терминах вима &lt;b&gt;S-V&lt;/b&gt;), выполняем&lt;br /&gt;&lt;b&gt;:'&amp;lt;,'&amp;gt;TOhtml&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;У нас открывается новое окно со следующим содержимым:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8787af;"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "&lt;a href="http://www.w3.org/TR/html4/loose.dtd"&gt;http://www.w3.org/TR/html4/loose.dtd&lt;/a&gt;"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;html&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;head&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;title&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #afaf87;"&gt;D:\proj\DForth\trunk\release\units\windows.de.html&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;title&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;meta&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;name&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"Generator"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;content&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"Vim/7.3"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;meta&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"content-type"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;content&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"text/html; charset=windows-1251"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;head&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;body&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;bgcolor&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#000000"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;text&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#a8a8a8"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;face&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"monospace"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a CreateWindowExA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG LONG HWND HMENU HINST LPVOID&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;HWND &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DefWindowProcA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND UINT WPARAM LPARAM&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LRESULT &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DestroyWindow&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;BOOL &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DispatchMessageA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;LPMSG&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;body&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;html&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Выполняем&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; :&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;&lt;span style="color: #0087af;"&gt;g/&lt;/span&gt;&amp;lt;body&lt;span style="color: #0087af;"&gt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;normal&lt;/span&gt;&amp;nbsp;k$dgg&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;, удаляется всё, что выше body:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;body&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;bgcolor&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#000000"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;text&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#a8a8a8"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;face&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"monospace"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a CreateWindowExA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG LONG HWND HMENU HINST LPVOID&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;HWND &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DefWindowProcA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND UINT WPARAM LPARAM&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LRESULT &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DestroyWindow&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;BOOL &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DispatchMessageA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;LPMSG&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;body&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;html&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь выполним сперва&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; :&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;&lt;span style="color: #0087af;"&gt;s&lt;/span&gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&amp;lt;body\s*&lt;span style="color: #00af87;"&gt;\(&lt;/span&gt;bgcolor="\#[a-f0-9]\{6\}"&lt;span style="color: #00af87;"&gt;\)&lt;/span&gt;\s*text=&lt;span style="color: #00af87;"&gt;\(&lt;/span&gt;"\#[a-f0-9]\{6\}"&lt;span style="color: #00af87;"&gt;\)&lt;/span&gt;\s*&amp;gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&amp;lt;font color=&lt;span style="color: #00af87;"&gt;\2&lt;/span&gt;&amp;gt;&lt;span style="color: #00af87;"&gt;/&lt;/span&gt;&lt;span style="color: #00af87;"&gt;i&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;затем&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; :&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;s#&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;/body&lt;span style="color: #0087af;"&gt;&amp;gt;&lt;/span&gt;\&lt;span style="color: #00af87;"&gt;(&lt;/span&gt;&lt;span style="color: #0087af;"&gt;.&lt;/span&gt;\|\n\&lt;span style="color: #00af87;"&gt;)&lt;/span&gt;*&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;/html&lt;span style="color: #0087af;"&gt;&amp;gt;#&amp;lt;&lt;/span&gt;/font&lt;span style="color: #0087af;"&gt;&amp;gt;#&lt;/span&gt;i&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Первая команда затронет строку, в которой открывается body, вторая -- строки, в которой закрываются body и html:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#a8a8a8"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;face&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"monospace"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a CreateWindowExA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG LONG HWND HMENU HINST LPVOID&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;HWND &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DefWindowProcA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND UINT WPARAM LPARAM&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LRESULT &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DestroyWindow&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;BOOL &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DispatchMessageA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;LPMSG&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Удаляем все теги &lt;b&gt;br&lt;/b&gt;:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; :&lt;span style="color: #87afaf;"&gt;%&lt;/span&gt;s#&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;br&lt;/span&gt;&lt;span style="color: #0087af;"&gt;&amp;gt;##&lt;/span&gt;i&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#a8a8a8"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;face&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"monospace"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a CreateWindowExA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;br /&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG LONG HWND HMENU HINST LPVOID&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;HWND &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DefWindowProcA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND UINT WPARAM LPARAM&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LRESULT &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DestroyWindow&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;BOOL &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DispatchMessageA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;LPMSG&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Наконец, удаляем первый перенос строки и последний:&lt;br /&gt;&lt;b&gt;ggJ&lt;/b&gt;&lt;br /&gt;&lt;b&gt;GkJ&lt;/b&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#a8a8a8"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;face&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"monospace"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a CreateWindowExA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;DWORD LPCTSTR LPCTSTR DWORD LONG LONG &lt;br /&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG LONG HWND HMENU HINST LPVOID&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;HWND &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DefWindowProcA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND UINT WPARAM LPARAM&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LRESULT &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DestroyWindow&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;HWND&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;BOOL &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;:a DispatchMessageA&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&lt;/span&gt;LPMSG&lt;span style="color: #00af87;"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/span&gt;&amp;nbsp;LONG &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;color&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;"#8700d7"&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;user32;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;font&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Всё, код полностью готов для вставки в блог.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8615616678617075725?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8615616678617075725/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/10/blog-post_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8615616678617075725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8615616678617075725'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/10/blog-post_16.html' title='Вставка кода с подсветкой в блог при помощи вима'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1681607827989193886</id><published>2011-10-16T05:12:00.001+04:00</published><updated>2011-10-16T05:13:09.678+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Пространства имён в DEmbro</title><content type='html'>Недавно в DEmbro появилась конструкция, которую я называл «короткое пространство имён», и я решил написать о пространствах имён в DEmbro и словарях вообще.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Обычные пространства имён&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пространства имён объявляются при помощи конструкции &lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&amp;nbsp;name &lt;span style="color: #87afaf;"&gt;...&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Все команды, объявленные внутри многоточия, будут командами пространства имён name. Например, рассмотрим код&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Global command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;X command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если теперь вызвать command, то будет напечатано "Global command". Чтобы вызвать слово из прострнства имён, нужно подключить прострнство X, просто вызвав его имя, затем вызвать команду, затем отключить пространство имён командой «^»:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; X command &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Можно между «X» и «^» вызывать несколько команд из пространства имён X, а так же глобальные команды, если они не были перекрыты внутри X. Возможно объявлять пространства имён внутри пространств имён. Вот достаточно крупный пример с комментариями:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: command1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Global command 1&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&amp;nbsp;&amp;nbsp;command1 &lt;span style="color: #8787af;"&gt;// напечатает "Global command 1", потому что команда ещё не перекрыта&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;X command 1&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;command1 &lt;span style="color: #8787af;"&gt;// напечатает "X command 1" — теперь это перекрытая команда&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;X command 2&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&amp;nbsp;Y &lt;span style="color: #8787af;"&gt;// создаём подпространство имён&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Y command 1&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command1 &lt;span style="color: #8787af;"&gt;// напечатает "Y command 1"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;command1 &lt;span style="color: #8787af;"&gt;// напечатает "X command 1" — мы уже вне пространства имён Y&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&lt;br /&gt;X command1 &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// напечатает "X command 1" — мы подключили пространство имён X&lt;/span&gt;&lt;br /&gt;X Y command1 &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// напечатает "Y command 1" — мы подключили подпространство имён Y&lt;/span&gt;&lt;br /&gt;X X command1 &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// напечатает "X command 1": X можно вызвать внутри, т.к. оно определено глобально&lt;/span&gt;&lt;br /&gt;X Y command2 &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// напечатает "X command 2" — внутри Y нет команды command2&lt;/span&gt;&lt;br /&gt;Y command1 &lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// ошибка: не объявлена команда Y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Конструкция uses&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Если нужно подключить сразу много пространств имён, то можно утомиться закрывать их все командой «^»:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;X Y Z W Q&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;.....&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы сделать это автоматически, можно воспользоваться конструкцией «uses ... \uses». Эта конструкция автоматически отключает все пространства, подключённые внутри многоточия. Например, предыдущий фрагмент перепишется в виде:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #8700d7;"&gt;uses&lt;/span&gt;&amp;nbsp;X Y Z W Q&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;.....&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\uses&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Расширения прострнства имён&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Иногда может возникнуть необходимость расширить пространство имён новыми словами вне конструкции «namespace ... \namespace». В этом случае можно воспользоваться конструкцией «extend-namespace .. \extend-namespace». Она берёт последнее подключённое пространство имён и делает так, что все команды, объявляемые внутри&amp;nbsp;&lt;span highlight="Search"&gt;&lt;/span&gt;многоточия, будут создаваться внутри него (если это поведение не будет явно изменено другими действиями с пространствами имён):&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;X &lt;span style="color: #8700d7;"&gt;extend-namespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\extend-namespace&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;«Короткие» пространства имён&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Помимо механизма «uses» есть и другой механизм упрощения отключения пространства имён: короткие пространства имён. Единственное их отличие от обычных в том, что они ищут только следующую команду в пространстве, и не требуют закрывающего слова. Проще такое понять на примере:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Global command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;shortnamespace&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;X command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;shortnamespace&lt;/span&gt;&amp;nbsp;Y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Y command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\shortnamespace&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\shortnamespace&lt;/span&gt;&lt;br /&gt;command &lt;span style="color: #8787af;"&gt;// Global command&lt;/span&gt;&lt;br /&gt;X command &lt;span style="color: #8787af;"&gt;// X command&lt;/span&gt;&lt;br /&gt;command &lt;span style="color: #8787af;"&gt;// Global command — короткие пространства имён воздействуют только на следующую команду&lt;/span&gt;&lt;br /&gt;X Y command &lt;span style="color: #8787af;"&gt;// Y command&lt;/span&gt;&lt;br /&gt;X X X X X X command &lt;span style="color: #8787af;"&gt;// X command&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если проводить аналогии с языком C++, то поведение обычных пространств имён напоминает то, что делает слово «using», а поведение коротких пространств имён — оператор «::». Можно даже в коде на DEmbro объявлять короткие пространства имён с таким суффиксом для большей наглядности:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;shortnamespace&lt;/span&gt;&amp;nbsp;X::&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;shortnamespace&lt;/span&gt;&amp;nbsp;Y::&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;: command&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;Y command&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\shortnamespace&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;\shortnamespace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;X&lt;span style="color: #8700d7;"&gt;:: Y::&lt;/span&gt;&amp;nbsp;command&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Словари, context и target стеки&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Расскажу теперь о том, как это всё организовано внутри.&lt;br /&gt;&lt;br /&gt;Первое важное понятие — словарь. Словарь — это просто список, сопоставляющей имени команды её код. Когда создаётся новое слово, оно добавляется в конец словаря. Когда ищется слово — оно ищется в словаре с конца.&lt;br /&gt;&lt;br /&gt;Для поддержки разделения команд на группы, в DEmbro-машине может быть несколько словарей. Есть специальный стек словарей, называющийся context. Когда DEmbro-машина ищет слово, чтобы его выполнить, она берёт самый верхний словарь со стека, пытается найти слово в нём, если не находит, то берёт следующий словарь, и пытается найти в нём, и т.д.&lt;br /&gt;&lt;br /&gt;Отдельный стек target используется для в каком-то смысле обратного действия — добавления команд. При добавлении команд DEmbro-машина берёт верхний словарь со стека target, и добавляет в него команду.&lt;br /&gt;&lt;br /&gt;Изначально в обоих стеках лежит словарь GLOBAL (на самом деле, это не совсем правда, но пока что предполагается так).&lt;br /&gt;&lt;br /&gt;Всю работу на DEmbro со словарями и стеками context и target можно выразить пятью основными словами:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;vocabulary-new ( -- voc) создаёт новый словарь и кладёт его в стек&lt;br /&gt;context&amp;lt; ( voc --) переносит словарь с основного стека в context&lt;br /&gt;context&amp;gt; ( -- voc) переносит словарь из стека context в основной&lt;br /&gt;target&amp;lt; ( voc --) переносит словарь с основного стека в target&lt;br /&gt;target&amp;gt; ( -- voc) переносит словарь из стека target в основной&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Реализация пространств имён через словари&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Напоследок я покажу как реализуются все слова по работе с пространствами имён через эти пять. Реализацию вы можете посмотреть в файле &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/core/default/voc.de"&gt;core/default/voc.de&lt;/a&gt;. Тут я опишу немного упрощённую версию, но полностью соответствующую описанному выше в посте.&lt;br /&gt;&lt;br /&gt;Сперва объявим вспомогательное слово vocabulary:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: vocabulary&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( "name")&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;create&lt;/span&gt;&amp;nbsp;vocabulary-new &lt;span style="color: #8700d7;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;does&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( -- voc)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Оно полезно для создания именованных словарей. Например, если теперь написать&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;vocabulary&lt;/span&gt;&amp;nbsp;X&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;то в дальнейшем вызов команды X будет приводить к тому, что на стек будет класться словарь, созданный командой vocabulary-new внутри vocabulary.&lt;br /&gt;&lt;br /&gt;Теперь объявим конструкцию «namespace»:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: namespace&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( "name")&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;create&lt;/span&gt;&amp;nbsp;vocabulary-new &lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;context&amp;lt; &lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;target&amp;lt; &lt;span style="color: #8700d7;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;does&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;context&amp;lt; &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \namespace&lt;/span&gt;&amp;nbsp;context&amp;gt; &lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;target&amp;gt; &lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Команда «namespace» создаёт и кладёт словарь в стеки context и target, команда «\namespace» скидывает верхние значения этих стеков. Кроме того, команда namespace переопределяет действие создаваемого слова: после строки&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&amp;nbsp;X&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;вызов X будет приводить к тому, что словарь кладётся в стек context, а не в обычный, как в случае с vocabulary.&lt;br /&gt;&lt;br /&gt;Легко объявить закрывающую конструкцию «^». Сперва я ещё объявляю конструкцию «^^^», явлюящуюся не-immediate версией «^»:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: ^^^&lt;/span&gt;&amp;nbsp;context&amp;gt; &lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;'&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^^^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;alias&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;^&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;immediate&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;В последней строке команда «^» объявляется как копия «^^^», только делается ещё и immediate.&lt;br /&gt;&lt;br /&gt;Объявим конструкцию расширения пространства имён:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: extend-namespace&lt;/span&gt;&amp;nbsp;context&amp;gt; &lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;context&amp;lt; target&amp;lt; &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;'&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;alias&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\extend-namespace&lt;/span&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Тут всё элементарно.&lt;br /&gt;&lt;br /&gt;Конструкция «uses» использует («задокументированную») фичу: в стеки словарей можно класть ноль:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: uses&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;0&lt;/span&gt;&amp;nbsp;context&amp;lt; &lt;span style="color: #87afaf;"&gt;0&lt;/span&gt;&amp;nbsp;target&amp;lt; &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: \uses&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;context&amp;gt; &lt;span style="color: #0087af;"&gt;0=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;until&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;target&amp;gt; &lt;span style="color: #0087af;"&gt;0=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;until&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Остались короткие пространства имён. Короткое пространство имён кладёт словарь в стек context, выполняет один шаг DEmbro-машины, после этого снимает словарь со стека. Для того, чтобы выполнить один шаг, используется команда «dembro-step»:&lt;br /&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #8700d7;"&gt;: shortnamespace&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;( "name")&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;namespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;does&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;context&amp;lt; dembro-step context&amp;gt; &lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;'&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\namespace&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;alias&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;\shortnamespace&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Конструкция отличается от «namespace» только поведением создаваемого ей словом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1681607827989193886?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1681607827989193886/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/10/dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1681607827989193886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1681607827989193886'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/10/dembro.html' title='Пространства имён в DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5837295301184622173</id><published>2011-10-13T05:18:00.000+04:00</published><updated>2011-10-13T05:18:41.007+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i386'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><category scheme='http://www.blogger.com/atom/ns#' term='asm'/><title type='text'>Условные переходы</title><content type='html'>Сессия сдана, пришло время продолжить разработки. &lt;br /&gt;&lt;br /&gt;Как я уже писал раньше, я пишу транслятор ассемблера. Только что пройден исторический этап: транслятор начал поддерживать инструкции условных переходов. Ура!&lt;br /&gt;&lt;br /&gt;Вот пример цикла: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:asm-noname PREFIX&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;*auto-integers? on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;mov&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;555&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;mov&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;ebx&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;111&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;@&amp;gt;&lt;/span&gt;&amp;nbsp;LOOP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;sub&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;sub&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;ebx&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;jnz&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@@&lt;/span&gt;&amp;nbsp;LOOP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;mov&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;d[&lt;/span&gt;&amp;nbsp;*out &lt;span style="color: #8700d7;"&gt;disp&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;ret&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;all-resolve&lt;br /&gt;\PREFIX &lt;span style="color: #8700d7;"&gt;asm-noname;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;execute&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Технические детали: при помощи &lt;b&gt;:asm-noname ... asm-noname; execute&lt;/b&gt; код на асме транслируется и сразу запускается. Блок &lt;b&gt;PREFIX ... \PREFIX&lt;/b&gt; указывает на то, что мы будем использовать префиксную запись инструкций (т.е. инструкции перед операндами). Вызов &lt;b&gt;*auto-integers? on&lt;/b&gt; делает так, что целые числа автоматически считаются операндами команд. (Без этой опции после чисел 555, 111, 2, 1 нужно бы было просто вызывать команду &lt;b&gt;imm&lt;/b&gt;. Это полезный режим, если мы хотим операнды вычислять, например, в этом режиме можно писать&amp;nbsp; &lt;b&gt;mov eax 64 1024 * imm&lt;/b&gt;, если не хочется в уме перемножать 64 и 1024. Кроме того, код может зависеть от чего-нибудь внешнего: например, тут &lt;b&gt;mov eax timer imm&lt;/b&gt; заносится состояние таймера в момент трансляции, операнд в явном виде не указан.)&lt;br /&gt;&lt;br /&gt;Теперь по коду. Сперва в соответствующие регистры кладётся 555 и 111. Далее, создаётся метка с именем &lt;b&gt;LOOP&lt;/b&gt;. После этого в цикле из eax вычитается 2, из ebx вычитается 1 до тех пор, пока ebx не обнулится. То, что останется от eax, переносится в &lt;b&gt;*out&lt;/b&gt; — глобальную переменную DEmbro, которую нужно определить выше, например, так:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;variable *out&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Но так делать вовсе необязательно, вместо &lt;b&gt;*out&lt;/b&gt; может быть любой указатель. Как нетрудно догадаться, в &lt;b&gt;*out&lt;/b&gt; будет занесено 333, далее с переменной можно работать из кода на DEmbro, или из следующей ассемблерной вставки. Таким образом ассемблер может обмениваться данными с DEmbro. Планируется более детальный механизм взаимодействия: из ассемблера можно будет получать доступ к стекам и другим структурам DEmbro-машины.&lt;br /&gt;&lt;br /&gt;Команда &lt;b&gt;all-resolve&lt;/b&gt; разрешает все метки. Дело в том, что на метку могут быть ссылки выше метки, ниже метки, или одновременно и так, и так. Нет возможности сразу это предугадать, поэтому метки и ссылки собираются в две таблицы, а в конце кода командой &lt;b&gt;all-resolve&lt;/b&gt; ссылкам ставятся в соответствие метки и нужные адреса проставляются. Из-за этой муторности условные переходы и были написаны самыми последними среди прочих инструкций. Теперь, я надеюсь, мне осталось только перебить таблицы из документации к &lt;b&gt;ia-32&lt;/b&gt; в свой транслятор.&lt;br /&gt;&lt;br /&gt;Сейчас транслятор поддерживает уже 84 инструкции. Подробнее о том, как я делал этот транслятор и о том, как сделать свой транслятор, напоминаю, планируется большой цикл статей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5837295301184622173?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5837295301184622173/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5837295301184622173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5837295301184622173'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/10/blog-post.html' title='Условные переходы'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7615329550255457046</id><published>2011-09-20T03:48:00.010+04:00</published><updated>2011-09-25T19:06:16.842+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='концепция'/><title type='text'>Полнота по Тьюрингу — насколько это хорошо?</title><content type='html'>Часто любят говорить, что такой-то язык программирования &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%BF%D0%BE_%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D1%83"&gt;полон по Тьюрингу&lt;/a&gt;. Насколько хорошо полнота по Тьюрингу характеризует язык с точки зрения практического применения?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;ИМХО, это свойство само по себе ничего не значит, его следует считать обязательным для любого языка программирования. Напротив, если какой-то язык программирования не полон по Тьюрингу, то это очень плохо, плохо настолько, что даёт повод серьёзно задуматься: а является ли этот язык языком программирования?&lt;br /&gt;&lt;br /&gt;Например, есть язык программирования &lt;a href="http://www.esolangs.org/wiki/BitBitJump"&gt;BitBitJump&lt;/a&gt;, о нём на русском можно почитать &lt;a href="http://www.opennet.ru/docs/RUS/bbjr/bbjr.utf8"&gt;тут&lt;/a&gt;. Язык состоит всего из одной инструкции: скопировать в памяти один бит в другой, и перейти по заданному адресу (переход происходит в любом случае, т.е. он безусловный). Инструкция имеет три операнда: 1) адрес, откуда копируем, 2) адрес, куда копируем, и 3) адрес, на который будет совершён переход выполнения программы. Важная оговорка: программа и данные находятся в одной памяти вместе, т.е. во время выполнения программа может модифицировать свой код.&lt;br /&gt;&lt;br /&gt;Кажется, что на таком языке ничего написать не получится. Однако, в статье, на которую я дал ссылку выше, можно почитать о том, как на этом языке реализовать сложение, умножение, условный переход, указатели и т.д.&lt;br /&gt;&lt;br /&gt;Оказывается, что язык BitBitJump полон по Тьюрингу. На нём можно посчитать любую вычислимую функцию.&lt;br /&gt;&lt;br /&gt;С точки зрения здравого смысла ясно, что BitBitJump радикально уступает привычным языкам программирования в практическом применении, потому что все они умеют копировать биты и совершать безусловные переходы.&lt;br /&gt;&lt;br /&gt;Для оценки именно практичности нужны какие-то другие критерии. Я не знаю, какие именно, но полнота по Тьюрингу на эту роль точно не подходит. Полнота по Тьюрингу скорее полезна в роли эдакого теста на дурака: отметать то, что не является языком программирования, но пытается себя за него выдать.&lt;br /&gt;&lt;br /&gt;Например, известен факт, что метапрограммирование (шаблоны в частности) в C++ является полным по Тьюрингу. Но это само по себе вовсе не говорит об удобстве (или неудобстве) в его применении на практике. Если бы метапрограммирование в C++ происходило на языке BitBitJump, то навряд ли это кого-то обрадовало бы, хотя полнота по Тьюрингу сохранилась бы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7615329550255457046?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7615329550255457046/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7615329550255457046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7615329550255457046'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/09/blog-post.html' title='Полнота по Тьюрингу — насколько это хорошо?'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8547335644744348307</id><published>2011-09-12T17:33:00.008+04:00</published><updated>2011-10-13T05:21:38.125+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i386'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><category scheme='http://www.blogger.com/atom/ns#' term='asm'/><title type='text'>Новости с разработок DEmbro</title><content type='html'>Сейчас у меня много дел, и на DEmbro остаётся мало времени.&lt;br /&gt;&lt;br /&gt;Недавно начал писать заголовок к &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/headers/winsock.de"&gt;windows sockets&lt;/a&gt;, вроде как самое необходимое объявлено. Написал при помощи него для примера простенькие &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/examples/windows/ws_client.de"&gt;клиент&lt;/a&gt; и &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/examples/windows/ws_server.de"&gt;сервер&lt;/a&gt;. Кроме того, написал &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/examples/windows/http_server.de"&gt;hello world&lt;/a&gt; http-ответом.&lt;br /&gt;&lt;br /&gt;Но основное направление деятельности сейчас — написание транслятора ассемблера. Планируется полная поддержка&lt;b&gt; ia32&lt;/b&gt; ассемблера (он же &lt;b&gt;x86&lt;/b&gt;). Сейчас уже реализована 51 инструкция. До юзабельности не хватает системы меток и инструкций переходов, а до полного счастья не хватает всяких там sse :)&lt;br /&gt;&lt;br /&gt;В целом, транслятор мне нравится. Вот пример кода на нём:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;mov&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;h100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;imm&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;mov&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;ecx&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;d[&lt;/span&gt;&amp;nbsp;*in2 &lt;span style="color: #8700d7;"&gt;disp&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;xor&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;d[&lt;/span&gt;&amp;nbsp;*in4 &lt;span style="color: #8700d7;"&gt;disp&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;imul&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;ecx&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;lea&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;d[&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;ecx&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;2*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;256&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;disp&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;and&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;d[&lt;/span&gt;&amp;nbsp;*out6 &lt;span style="color: #8700d7;"&gt;disp&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;eax&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Конкретные примеры использования асма на DEmbro можно посмотреть &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/asm/i386/test2.de"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;О трансляторе подробно будет целый цикл статей, если руки дойдут.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8547335644744348307?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8547335644744348307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/09/dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8547335644744348307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8547335644744348307'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/09/dembro.html' title='Новости с разработок DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-4742698680216458386</id><published>2011-08-17T16:12:00.001+04:00</published><updated>2011-08-17T16:14:45.196+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>Таблицы различия диалектов ЯПов</title><content type='html'>Наткнулся на отличный сайт о различиях схожих языков программирования&lt;br /&gt;&lt;a href="http://hyperpolyglot.org/"&gt;http://hyperpolyglot.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В частности, там есть очень полезная &lt;a href="http://hyperpolyglot.org/lisp"&gt;таблица сравнения лиспов&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-4742698680216458386?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/4742698680216458386/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/08/blog-post_17.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4742698680216458386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4742698680216458386'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/08/blog-post_17.html' title='Таблицы различия диалектов ЯПов'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5295430540207018788</id><published>2011-08-16T11:32:00.002+04:00</published><updated>2011-08-16T11:33:46.441+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='блог'/><title type='text'>Скрытие раздела «Добро пожаловать»</title><content type='html'>Чтобы раздел «Добро пожаловать» не отображался на странице с постом, в настройках дизайна содержимое виджета я заключил в оператор if:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;b:widget id="Text1" locked="false" title="Добро пожаловать!" type="Text"&gt;&lt;/b:widget&gt;&lt;/span&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:widget &lt;/span&gt;&lt;span style="color: #87af87;"&gt;id&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'Text1'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;locked=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'false'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;title&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'Добро пожаловать!'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #87af87;"&gt;type&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'Text'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:includable &lt;/span&gt;&lt;span style="color: #87af87;"&gt;id&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'main'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:if cond=&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'data:blog.pageType != &lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;item&lt;/span&gt;&lt;span style="color: #00af87;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color: #87afaf;"&gt;'&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:if&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:includable&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00afaf;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #0087af;"&gt;b&lt;/span&gt;&lt;span style="color: #00afaf;"&gt;:widget&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5295430540207018788?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5295430540207018788/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5295430540207018788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5295430540207018788'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/08/blog-post.html' title='Скрытие раздела «Добро пожаловать»'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8780514238087267024</id><published>2011-08-16T11:18:00.002+04:00</published><updated>2011-08-16T11:28:45.751+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro уже год</title><content type='html'>Год назад в начале августа я задумал написать свой форт, чтобы разобраться в этом языке. Очень быстро я понял, что хочу написать полноценный язык, на котором смогу писать свои реальные программы.&lt;br /&gt;&lt;br /&gt;Поначалу у меня не было никакого опыта программирования на фортах, а было теоретическое, чисто математическое понимание того, чем они хороши и удобны. Спустя несколько месяцев DEmbro был развит до того, что я начал писать какие-то библиотеки и программы, и время от времени у меня возникал вопрос «Как на таком можно писать??». Но со временем привык, и теоретическое понимание перешло в практическое. &lt;br /&gt;&lt;br /&gt;Многое в DEmbro было заложено в самом начале разработки, пока я ещё не до конца разобрался с устройством форта, и потому некоторые фундаментальные вещи написаны неправильно и требуют рефакторинга. Рефакторинг висит на мне уже несколько месяцев, мешая дальнейшей разработке.&lt;br /&gt;&lt;br /&gt;Изначальная вера в то, что я смогу всё реализовать, немного пошатнулась. В первую очередь, концептуальные проблемы возникают с преобразованиями шитого кода (которые нужны для оптимизации и сборки исполняемого кода). Вторая проблема, которую я считаю концептуально серьёзной, — числа с плавающей точкой (да и вообще типы с фиксированным размером, но нестандартным). Об этих проблемах я подробно напишу позже.&lt;br /&gt;&lt;br /&gt;Остальное задуманное не предвещает бед. Локальные переменные, исключения и шаблоны уже используются в некотором объёме, но требуют некоторой шлифовки. После рефакторинга ядра будут начаты&amp;nbsp; классы (с итератороми и элементами функционального программирования), они уже запроектированы. Взаимодействие с внешними программами планируется очень хорошее, аналогов задуманному нигде не видел.&lt;br /&gt;&lt;br /&gt;Вот график количества изменений DEmbro по месяцам:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://s57.radikal.ru/i157/1108/81/960bf7c79749.png" /&gt;&lt;br /&gt;&lt;br /&gt;Первый провал графика связан с зимней сессией, которая была с декабря 2010ого по явнварь 2011ого. Второй провал связан с летней сессией, начавшейся в мае (пятый месяц). Провал графика между ними, скорее всего, связан с жизненными проблемами, когда мне было не до DEmbro. Сейчас на свне уже более 550 коммитов.&lt;br /&gt;&lt;br /&gt;Я надеюсь, что дальше всё будет идти успешно, и я осуществлю хотя бы бо́льшую часть задуманного.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8780514238087267024?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8780514238087267024/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/08/dembro_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8780514238087267024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8780514238087267024'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/08/dembro_16.html' title='DEmbro уже год'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5355758966693811528</id><published>2011-08-10T23:32:00.001+04:00</published><updated>2011-08-10T23:32:27.180+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Добавление команд в ядро DEmbro</title><content type='html'>Упростил процедуру добавления команд в ядро DEmbro.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Допустим, что я хочу добавить группу команд «file», в которую входят &lt;span style="font-family: monospace;"&gt;fopen&lt;/span&gt;, &lt;span style="font-family: monospace;"&gt;fclose&lt;/span&gt;, &lt;span style="font-family: monospace;"&gt;fwrite&lt;/span&gt; и &lt;span style="font-family: monospace;"&gt;fread&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как это было раньше&lt;/b&gt;&lt;br /&gt;Заходим в директорию &lt;span style="font-family: monospace;"&gt;source\DEmbro\commands&lt;/span&gt;, создаём там файл &lt;span style="font-family: monospace;"&gt;DCommandsFile.pas4&lt;/span&gt;, в нём пишем паскалевский модуль, в котором реализуем все команды. &lt;br /&gt;&lt;br /&gt;Создаём в модуле публичную функцию LoadCommands, в которой добавляем каждую команду в ядро (при помощи функции AddCommand).&lt;br /&gt;&lt;br /&gt;Далее, заходим в главный файл проекта &lt;span style="font-family: monospace;"&gt;source\DEmbro\dembro32.dpr&lt;/span&gt;, в разделе &lt;span style="font-family: monospace;"&gt;uses&lt;/span&gt; добавляем подключение нового модуля.&lt;br /&gt;&lt;br /&gt;Теперь, заходим в &lt;span style="font-family: monospace;"&gt;source\DEmbro\DForthMachine.pas4&lt;/span&gt;, в приватной секции &lt;span style="font-family: monospace;"&gt;uses&lt;/span&gt; тоже прописываем новый модуль. В методе &lt;span style="font-family: monospace;"&gt;OForthMachine.Create&lt;/span&gt; того же файла добавляем строку &lt;span style="font-family: monospace;"&gt;DCommandsFile.LoadCommands(@Self);&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;В этот момент команда появилась в ядре дембро, проект можно компилировать. Чтобы при стандартном запуске дембро эти команды были видны, нужно проделать ещё пару шагов.&lt;br /&gt;&lt;br /&gt;Заходим в &lt;span style="font-family: monospace;"&gt;core\release\default&lt;/span&gt;, создаём файл &lt;span style="font-family: monospace;"&gt;file.de&lt;/span&gt;, в нём при помощи команды &lt;span style="font-family: monospace;"&gt;samebuiltin&lt;/span&gt; прописываем подключаемые команды.&lt;br /&gt;&lt;br /&gt;В файле &lt;span style="font-family: monospace;"&gt;core\release\default\system.de&lt;/span&gt; прописываем&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;str" core\default\file.de" evaluate-file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь всё сделано. За исключением того, что ещё желательно писать хелп для каждой команды. Ужас, не правда ли?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как это будет теперь&lt;/b&gt;&lt;br /&gt;Заходим в &lt;span style="font-family: monospace;"&gt;source\DEmbro\commands&lt;/span&gt;, создаём файл &lt;span style="font-family: monospace;"&gt;file.cmd&lt;/span&gt;, в нём реализуем команды в таком виде:&lt;br /&gt;&lt;br /&gt;DECLARE(fopen)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body( code for open );&lt;br /&gt;RUS SUMMARY ( i B: s -- f) открывает файл по имени с заданными флагами&lt;br /&gt;&lt;br /&gt;DECLARE(fclose)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body( code for close);&lt;br /&gt;RUS SUMMARY ( f --) закрывает файл, открытый ранее при помощи команды fopen&lt;br /&gt;&lt;br /&gt;DECLARE(fread)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body( code for read);&lt;br /&gt;RUS SUMMARY ( pif --) читает i байт в область памяти p из файла f&lt;br /&gt;&lt;br /&gt;DECLARE(fwrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body( code for write);&lt;br /&gt;RUS SUMMARY ( pif --) записывает i байт из области памяти p из файла f&lt;br /&gt;&lt;br /&gt;Далее, в файле &lt;span style="font-family: monospace;"&gt;source\DEmbro\commands\groups.list&lt;/span&gt; добавляем строку &lt;span style="font-family: monospace;"&gt;GROUP(file)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Теперь в директории &lt;span style="font-family: monospace;"&gt;source\DEmbro&lt;/span&gt; можно выполнить &lt;span style="font-family: monospace;"&gt;make commands&lt;/span&gt; и команды будут автоматически разнесены по всем нужным файлам, остаётся только скомпилировать ядро.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как это работает&lt;/b&gt;&lt;br /&gt;Файлы &lt;span style="font-family: monospace;"&gt;*.cmd&lt;/span&gt; и &lt;span style="font-family: monospace;"&gt;groups.list&lt;/span&gt; обрабатываются при помощи &lt;span style="font-family: monospace;"&gt;m4&lt;/span&gt; в несколько проходов, каждый раз предварительно подгружаются разные библиотеки. Библиотеки распологаются в &lt;a href="http://code.google.com/p/dforth/source/browse/#svn%2Ftrunk%2Fsource%2Fm4"&gt;source\m4&lt;/a&gt; и начинаются с буквы «c» (от слова commands).&lt;br /&gt;&lt;br /&gt;Например, чтобы сгенерировать список подключения команд в ядре, используется &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/cload.m4"&gt;cload.m4&lt;/a&gt; в следующей команде&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: monospace;"&gt;m4 ..\m4\cload.m4 temp\all.cmd &amp;gt; temp\load.inc4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Сгенерированный файл &lt;span style="font-family: monospace;"&gt;load.inc4&lt;/span&gt; выглядит примерно так:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("malloc", _malloc, False);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("free", _free, False);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("realloc", _realloc, False);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("move", _move, False);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("fill", _fill, False);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddCommand("current-directory", _current_directory, False);&lt;br /&gt;&lt;br /&gt;А если проделать то же самое, но подключать &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/cbuiltin.m4"&gt;cbuiltin.m4&lt;/a&gt;, то получим файл вида &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/core/builtin/mem.de"&gt;mem.de&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Аналогичным образом строятся другие файлы, а в будущем будут строиться хелпы. Напоследок приведу текущий код скрипта, раскидывающий команды (таргет commands в главном makefile):&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type commands\mem.cmd commands\misc.cmd &amp;gt; temp\all.cmd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cgroups.m4 commands\groups.list &amp;gt; temp\all.cmd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cload.m4 temp\all.cmd &amp;gt; temp\load.inc4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 commands.m4 temp\load.inc4 &amp;gt; temp\load.incq&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dquotes temp\load.incq load.inc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cbody.m4 temp\all.cmd &amp;gt; temp\body.inc4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 commands.m4 temp\body.inc4 &amp;gt; temp\body.incq&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dquotes temp\body.incq body.inc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cevaluate.m4 commands\groups.list &amp;gt; ..\..\release\core\builtin\all.de&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cbuiltin.m4 commands\mem.cmd &amp;gt; ..\..\release\core\builtin\mem.de&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 ..\m4\cbuiltin.m4 commands\misc.cmd &amp;gt; ..\..\release\core\builtin\misc.de&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5355758966693811528?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5355758966693811528/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/08/dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5355758966693811528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5355758966693811528'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/08/dembro.html' title='Добавление команд в ядро DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7315334383596888369</id><published>2011-08-10T15:53:00.002+04:00</published><updated>2011-08-16T11:43:08.681+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='блог'/><title type='text'>Официальные каты</title><content type='html'>А официальные каты таки существуют!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;В режиме «создать» есть кнопка разрыва страницы. Но в режиме «Изменить HTML» я не видел этой кнопки. В этом режиме следует использовать строку&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #8787af;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #8787af;"&gt;--more--&lt;/span&gt;&lt;span style="color: #8787af;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Текст ссылки на полную версию поста можно поменять в меню «Настройки -&amp;gt; Дизайн -&amp;gt; Элементы страницы -&amp;gt; Сообщения блога -&amp;gt; Изменить -&amp;gt; &lt;strong style="font-weight: normal;"&gt;Текст ссылки на Страницу сообщения&lt;/strong&gt;».&lt;br /&gt;&lt;br /&gt;Кроме того, включил обновлённый редактор, функция отключения автовставки тега br радует.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7315334383596888369?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7315334383596888369/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/08/html.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7315334383596888369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7315334383596888369'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/08/html.html' title='Официальные каты'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8499336503856537855</id><published>2011-07-30T14:56:00.006+04:00</published><updated>2011-07-30T15:19:16.569+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Ещё одна игра на DEmbro</title><content type='html'>Написал ещё одну игру, опять &lt;a href="http://igdc.ru/viewpage.php?page_id=89"&gt;на конкурс IGDC&lt;/a&gt;. Темой конкурса была змейка.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://s42.radikal.ru/i095/1107/89/936632b4b0e6.jpg" &gt;&lt;br /&gt;&lt;br /&gt;Писал в последний день конкурса семь с половиной часов подряд, с перерывом на ужин.&lt;br /&gt;&lt;br /&gt;В основном, переделывал предыдущую игру (Maze Journey). Изначально у меня была&lt;br /&gt;идея ради эксперимента не трогать основные модули, а только написать специальные&lt;br /&gt;уровни для Maze Journey, в которых реализуется змейка. Но передумал, как минимум&lt;br /&gt;управление хотелось сделать по-нормальному.&lt;br /&gt;&lt;br /&gt;Что забавно, в получившейся змейке можно подгрузить уровень из Maze Journey,&lt;br /&gt;и он будет благополучно работать. (Чем я и воспользовался при изготовлении&lt;br /&gt;«титров» — делал в последний момент в спешке, просто переделав соответствующие&lt;br /&gt;титры из Maze Journey. Плохо, конечно, но ИМХО лучше абы какие титры, чем&lt;br /&gt;никаких.)&lt;br /&gt;&lt;br /&gt;Забыл проверить размер перед отправкой, а зря — оказалось, что релиз весит 1,99 МБ.&lt;br /&gt;Большой размер связан с тем, что я отправил дебаг версию DEmbro, весящую более&lt;br /&gt;полутора мегабайта, в то время как релиз версия весит всего 76 КБ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8499336503856537855?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8499336503856537855/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/07/snake-journey.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8499336503856537855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8499336503856537855'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/07/snake-journey.html' title='Ещё одна игра на DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-927990036108372721</id><published>2011-07-18T22:25:00.004+04:00</published><updated>2011-08-16T11:44:46.300+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='блог'/><title type='text'>Бажные каты</title><content type='html'>Предыдущий пост на главной странице выглядит некорректно — каты сработали неправильно, рррррр. Тег table включает отображение текста, даже если сам тег вложен внутрь скрытого span'а. Странное поведение. Пришлось отключить кат.&lt;br /&gt;&lt;br /&gt;Когда же наконец появится что-нибудь официальное для катов вместо этой глючной поделки?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[updated] &lt;/b&gt;Нашёл &lt;a href="http://keyfighter.blogspot.com/2011/08/html.html"&gt;официальные каты&lt;/a&gt;. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-927990036108372721?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/927990036108372721/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/927990036108372721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/927990036108372721'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/07/blog-post.html' title='Бажные каты'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5153761970428545435</id><published>2011-07-18T15:01:00.014+04:00</published><updated>2011-11-22T23:22:01.751+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Пара слов о том, как делался Maze Journey</title><content type='html'>Недавно участвовал в конкурсе &lt;a href="http://igdc.ru/viewpage.php?page_id=88"&gt;IGDC&lt;/a&gt;, писал игру на DEmbro. Это был достаточно интересный опыт использования на практике своего языка.&lt;br /&gt;&lt;br /&gt;Сразу оговорюсь, что в DEmbro полно недоделок, он глючный, и я плохо на нём программирую :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Средства разработки&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DEmbro и текстовый редактор Vim. Выглядит это как-то так:&lt;br /&gt;&lt;img src="http://i057.radikal.ru/1107/a1/cd479c1c4f6e.png" /&gt;&lt;br /&gt;&lt;br /&gt;Из средств отладки — печать значений на консоль, комментирование подозриетльных фрагментов кода, и возможность без запуска всей игры загрузить какой-то отдельный модуль в REPL режиме и быстро посмотреть как себя ведут команды.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Коротко о языке&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Я использовал (за исключением нескольких незначительных мест) только три типа: целое число, указатель и строка. Хотя типов как таковых в DEmbro нет. Все операции производятся на стеке, для чисел и указателей один стек, для строк — отдельный. Круглые скобки используются для многострочных комментариев, а для однострочных — общепринятое «//».&lt;br /&gt;&lt;br /&gt;Несколько примеров:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// положить на стек число 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// положить на стек число 2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// положить на стек числа 3, 4 и 5. Теперь стек выглядит так: 1 2 3 4 5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// сложить два верхних числа. Теперь стек выглядит так: 1 2 3 9&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// умножить два верхних числа. Теперь стек выглядит так: 1 2 27&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00af87;"&gt;swap&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// поменять два верхних числа местами, 1 27 2&lt;/span&gt;&lt;br /&gt;div &lt;span style="color: #8787af;"&gt;// нацело поделить два верхних числа, 1 13&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;max&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// из двух верхних элементов оставить максимальный, 13&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0087af;"&gt;1+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// увеличить верхнее число на 1, получится 14&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// скинуть верхний элемент со стека, теперь стек вернулся в начальное состояние&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Можно писать свои команды при помощи конструкции&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: name&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;.....&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;где name — имя команды.&lt;br /&gt;&lt;br /&gt;(Именем может быть любая последовательность символов без пробелов. Никаких ограничений на имя нет (можно переопределять стандартные слова).)&lt;br /&gt;&lt;br /&gt;Например, в программе всё измеряется в миллесекундах. Но иногда приходится задавать время в минутах. Чтобы задать пять минут, нужно 5 умножить на 60*1000, и получится соответствующее число миллисекунд. Чтобы делать это вычисление автоматически, можно написать команду&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: mins&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;60000&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Теперь можно просто записать&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;5&lt;/span&gt;&amp;nbsp;mins&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;и получить время в миллесекундах для пяти минут.&lt;br /&gt;&lt;br /&gt;Команды можно выполнять косвенно. При помощи символа апостроф, за которым идёт название команды, можно положить указатель на эту команду. А при помощи команды execute выполнить указатель с вершины стека. Т.е.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;'&lt;/span&gt;&amp;nbsp;mins &lt;span style="color: #8700d7;"&gt;execute&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;эквивалентно коду «5 mins».&lt;br /&gt;&lt;br /&gt;Можно создавать анонимные команды при помощи команды «:noname»:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname ."&lt;/span&gt;&amp;nbsp;Hello &lt;span style="color: #0087af;"&gt;world" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;cr ;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;После выполнения этого кода на стеке будет лежать указатель на команду, который можно скормить команде execute на выполнение. Так, например:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname ."&lt;/span&gt;&amp;nbsp;Hello &lt;span style="color: #0087af;"&gt;world" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;cr ; execute&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Пара примеров на работу с указателями и переменными:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;variable&lt;/span&gt;&amp;nbsp;x &lt;span style="color: #8787af;"&gt;// создаёт область памяти под целое число или указатель&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;// теперь вызов команды x кладёт на стек указатель на эту область памяти&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;5&lt;/span&gt;&amp;nbsp;x &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// записать число 5 в переменную x&lt;/span&gt;&lt;br /&gt;x &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// положить в стек значение переменной x&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// распечатать на консоль полученное число&lt;/span&gt;&lt;br /&gt;x &lt;span style="color: #87afaf;"&gt;off&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// записать в переменную x ноль&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Ещё есть условный оператор и циклы.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: printbool&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;TRUE&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;." &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;FALSE&lt;/span&gt;&lt;span style="color: #0087af;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;then&lt;/span&gt;&amp;nbsp;cr &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8787af;"&gt;// создаём команду printbool&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;// она снимает со стека верхний элемент, и если он ноль, то печатает FALSE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;// иначе TRUE&lt;/span&gt;&lt;br /&gt;false printbool &lt;span style="color: #8787af;"&gt;// напечатает FALSE&lt;/span&gt;&lt;br /&gt;true printbool &lt;span style="color: #8787af;"&gt;// напечатает TRUE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;printbool &lt;span style="color: #8787af;"&gt;// напечатает TRUE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;printbool &lt;span style="color: #8787af;"&gt;// напечатает FALSE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;0&amp;lt;&amp;gt;&lt;/span&gt;&amp;nbsp;printbool &lt;span style="color: #8787af;"&gt;// напечатает TRUE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8787af;"&gt;// печатает числа от 0 до 10&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname 0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;begin&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;&amp;lt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;while&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;dup&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;1+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;repeat&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;execute&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Условные операторы и циклы являются компилирующими командами, и потому их можно использовать только внутри описания команд.&lt;br /&gt;&lt;br /&gt;Сказанного должно быть достаточно для понимания того, что будет ниже. Чтобы не затягивать вступление до бесконечности, дам напоследок несколько ссылок&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dforth/wiki/DEmbro"&gt;Пишущееся вики&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/core/default/op.de"&gt;Файл с реализацией условного оператора и простых циклов&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/statements/switch.de"&gt;Файл с реализацией оператора switch&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/core/default/voc.de"&gt;Файл с реализацией работы с пространствами имён&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Практически никакого контроля нет ни на стадии компиляции, ни на стадии интерпретации. Что лежит на стеке или в памяти узнать нельзя. Можно написать на свой страх и риск почти любую фигню с непредсказуемым исходом.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Кратко об игре&lt;/b&gt;&lt;br /&gt;Лучше один раз увидеть, чем сто раз услышать, так что отсылаю читателя самому сыграть в &lt;a href="http://igdc.ru/viewpage.php?page_id=88"&gt;игру&lt;/a&gt; (в конкурсном архиве запускать надо Doj\mazejourney\release\run.bat).  Я написал на DEmbro создание окна и инициализацию OpenGL достаточно давно. Т.к. числа с плавающей точкой в DEmbro немного сыроваты (в частности, нет нормального способа передать double в виде параметра в dll функцию), я решил для упрощения жизни их не использовать вообще. Кроме того, я не писал ни поддержки текстур, ни каких-то хитрых примитивов. Единственное, что я использовал при рендере — цветные квадраты.  Игру я писал с девизом «каждый уровень имеет свой уникальный геймплей». Поэтому нужно было иметь удобные конструкции для описания уровней.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как описывается уровень&lt;/b&gt;&lt;br /&gt;Чтобы не томить любителей ковыряться самостоятельно, рекомендую посмотреть файл «game\levels\big.de» — он является очень простым примером того, как описывается уровень. Кстати, по-поводу этого уровня, в нём можно усмотреть букву O — это чит, позволяющий пройти в определённом месте сквозь стену и оказаться у выхода.  Итак, первым делом я написал команду lab, которая позволяет в наглядном текстовом виде описывать уровни. Например, так: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;lab&lt;/span&gt;&lt;br /&gt;##########&lt;br /&gt;#S&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; F#&lt;br /&gt;##########&lt;br /&gt;\lab&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;(Из-за бага в ядре дембро, после слова «lab» нужно ставить пробел.)  Команда lab использует функцию ядра «source-next-line», которая читает следующую строку исходника. По первой строке определяется ширина уровня, а дальше создаёт двумерный массив, содержащий ascii коды символов. После выполнения этой конструкции можно при помощи команды last-lab-x получить ширину лабиринта, при помощи last-lab-y высоту лабиринта, а при помощи last-lab-maze указатель на двумерный массив.  Далее я написал команду «level», которая создаёт уровень. Напрямую она практически не используется, но в файле «game\levels\list.de» определяется надстройка над ней — newlevel, которая внутри себя вызывает level, выполняет файл, имя которого следует после «newlevel», и связывает уровни в последовательность. В том же файле list.de можно обнаружить сам список уровней.  Как только мы создали уровень (командой level) можно приступать к его наполнению. Команда «maze!» установит на текущем уровне последний лабиринт, созданный командой «lab». При помощи команд «cell-x!» и «cell-y!» можно установить размер в пикселях одной ячейки лабирнта текущего уровня, например так: 16 cell-x! 16 cell-y! При помощи команд «offset-x!» и «offset-y!» задаётся положение лабиринта на экране. Т.к. всегда мне нужно было центрировать лабирит, я написал команду «centrize», которая автоматически вызывает «offset-x!» и «offset-y!», вычисляя смещение при помощи размера лабиринта и размера ячейки.  При помощи команд «player-x!» и «player-y!» можно установить координаты ячейки, в которой будет появляться игрок в начале уровня.  Перейдём к более нетривиальным элементам уровня — событиям. Можно описать команды, которые будут выполняться при старте уровня — при помощи этого механизма запускается звук гонга перед началом уровня: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname pchar"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;data\sounds\newlevel.wav" &lt;/span&gt;&lt;span style="color: #87afaf;"&gt;sound ;init&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Тут просто вызывается команда sound, которая принимает один параметр — указатель на pchar-строку, содержащую имя звукового файла.  Менее тривиальный примеры — события, когда игрок входит на какую-то ячейку. Можно установить на каждый тип (т.е. ascii-символ) ячейки свой обработчик. Обработчику на стеке передаются x,y координаты ячейки, на которую пытается войти игрок. Если их скинуть со стека, то игрок не сможет зайти в ячейку, т.е. можно описать обработчик для стены: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;enter_ #&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Есть команда passed, которая, наоборот, считывает x,y и смещает в них игрока. Можно написать &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname passed&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;enter_ O&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Тогда игрок сможет заходить в букву O. Чтобы буква O выглядела как обычная стена, для неё нужно определить такой же обработчик рисования (который тоже принимает координаты x,y), как и для стены: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: draw_#&lt;/span&gt;&amp;nbsp;COLOR 2dup&amp;nbsp;PURPLES GEN[]2 ^ set-color draw-cell-rect &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;draw_# &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;draw_ #&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;draw_# &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;draw_ O&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Есть ещё один тип обработчиков для каждой ячейки — обработчик инициализации. Обработчики инициализации нужно установить перед вызовом команды «lab». Тогда при считывании каждой ячейки внутри конструкции «lab .... \lab» будет вызван соответствующий заданному ascii-символу обработчик инициализации.  Пример использования: всегда неудобно задавать положение игрока координатами при помощи «player-x!» и «player-y!». Гораздо удобнее пометить нужную ячейку буквой S. Для этого перед выполнением «lab» достаточно добавить обработчик инициализации ячейки S: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;player-y! player-x! &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;oninit_ S&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;При входе на букву F по умолчанию задан переход к следующему уровню командой «next». При желании аналогичной функциональностью можно наделить другие буквы, и сделать переходы на другие уровни.  Таковы общие принципы создания уровней. Теперь я разберу особенности разработки некоторых уровней. Часто, из-за копипасты в описнии уровней можно увидеть много ненужного кода, — я не успел его удалить до дедлайна.  &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Уровень в темноте (dark.de)&lt;/b&gt;&lt;br /&gt;На этом уровне игрок видит только соседние с собой клетки. Нужно просто при рисовании стены посчитать расстояние игрока до стены, и если оно больше одного, то не рисовать стену: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;2dup player-y &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;abs&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;swap&lt;/span&gt;&amp;nbsp;player-x &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;abs&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;max&lt;/span&gt;&amp;nbsp;&lt;span style="color: #87afaf;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00af87;"&gt;drop&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;COLOR&amp;nbsp;2dup PURPLES GEN[]2 ^ set-color draw-cell-rect &lt;br /&gt;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;draw_ #&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Уровень-цикл (loop.de)&lt;/b&gt;&lt;br /&gt;Тоже уровень в темноте, в котором если ходить по часовой стрелке, то будешь бегать по кругу, а если пойти против часовой стрелки, то прийдёшь к выходу. Реализация простая: описываются при помощи команды «lab» три лабиринта — тот, который изначально, тот, который с циклом, и тот, который с выходом. Изначальный нужен, чтобы закрутить игрока идти по часовой стрелки, его мы устанавливаем в уровне командой «maze!». Остальные два сохраняем в переменные. Вот, например, цикличный лабиринт: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #87afaf;"&gt;lab&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #######&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;###### ### #&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# # #&lt;br /&gt;# ###### # #&lt;br /&gt;# #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# #&lt;br /&gt;# #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# #&lt;br /&gt;# ######## #&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #87afaf;"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&lt;br /&gt;############&lt;br /&gt;\lab&lt;br /&gt;&amp;nbsp;&amp;nbsp;last-lab-x &lt;span style="color: #8700d7;"&gt;value&lt;/span&gt;&amp;nbsp;1maze-x&lt;br /&gt;&amp;nbsp;&amp;nbsp;last-lab-y &lt;span style="color: #8700d7;"&gt;value&lt;/span&gt;&amp;nbsp;1maze-y&lt;br /&gt;&amp;nbsp;&amp;nbsp;last-lab-maze &lt;span style="color: #8700d7;"&gt;value&lt;/span&gt;&amp;nbsp;1maze-ptr&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;На карте есть ячейки 1 и 2. При наступании на 1 включается лабиринт с циклом, при наступании на 2 — лабиринт с выходом. Вот их обработчики: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname passed&lt;/span&gt;&amp;nbsp;1maze-x maze-x &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;1maze-y maze-y &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;1maze-ptr maze-ptr &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;enter_ &lt;span style="color: #87afaf;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname passed&lt;/span&gt;&amp;nbsp;2maze-x maze-x &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;2maze-y maze-y &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;2maze-ptr maze-ptr &lt;span style="color: #00afaf;"&gt;!&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;enter_ &lt;span style="color: #87afaf;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Проверка видимости сделана так же, как и в dark.de, только расстояние берётся не 1, а 3 ячейки.  &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Уровень с убегающим выходом (runningexit.de)&lt;/b&gt;&lt;br /&gt;Алгоритм убегания выхода простой. Если игрок приблизился на близкое расстояние по обеим координатам, то выход смещается. Выбирается координата, по которой расстояние до игрока больше, после чего выход смещается от игрока по этому направлению. Если это не удаётся (стена), пытаемся сместить выход в перпендикулярном направлении.  Поэтому, например, если игрок идёт на выход по узкому коридору, то выход будет убегать по этому коридору от игрока, и свернёт в бок, как только упрётся в стену.  Там используется событие after-update для всех этих расчётов и рендера выхода (рендер сделан отдельный, потому что выход при смещении с ячейки на ячейку должен смещаться плавно). Когда выход смещается, в лабиринте перезаписывается его расположение, поэтому событие попадания в выход обрабатывается корректно обычным образом.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Уровень с двигающимися стенами (movingwalls.de)&lt;/b&gt;&lt;br /&gt;Идея аналогична уровню-циклу. Я создал два лабиринта: главный прямоугольник с выходом, и лабиринт со штуковиной. И сохранил его в переменные (moving-x, moving-y, moving-ptr).  Далее, я переопределил события рендера и входа для пробела: &lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#000000"&gt;&lt;span style="color: #a8a8a8;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;: draw#brown&lt;/span&gt;&amp;nbsp;COLOR 2dup&amp;nbsp;BROWNS GEN[]2 ^ set-color draw-cell-rect &lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;2dup moving-x &lt;span style="color: #0087af;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;player-y &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;cells&lt;/span&gt;&amp;nbsp;moving-ptr &lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #87afaf;"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;if&lt;/span&gt;&amp;nbsp;draw#brown &lt;span style="color: #0087af;"&gt;else&lt;/span&gt;&amp;nbsp;2drop &lt;span style="color: #0087af;"&gt;then&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;draw_&lt;br /&gt;&lt;span style="color: #8700d7;"&gt;:noname &lt;/span&gt;&amp;nbsp;2dup moving-x &lt;span style="color: #0087af;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;player-y &lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;cells&lt;/span&gt;&amp;nbsp;moving-ptr &lt;span style="color: #0087af;"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00afaf;"&gt;@&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #87afaf;"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;if&lt;/span&gt;&amp;nbsp;2drop &lt;span style="color: #0087af;"&gt;else&lt;/span&gt;&amp;nbsp;passed &lt;span style="color: #0087af;"&gt;then&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;;&lt;/span&gt;enter_&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;(Там в конце, каждого определения должно быть по два пробела.)  Число 35 — это ascii код для символа решётки (который я получил при помощи команды «ga» в виме). Тут всё просто: чтобы определить нужно ли рисовать на пустом месте что-то, берётся значение из вспомогательного лабиринта со штуковиной, с прибавлением y-координаты игрока.  &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Заключение&lt;/b&gt; &lt;br /&gt;&amp;nbsp;В целом, разрабатывать игру мне очень понравилось.&lt;br /&gt;&lt;br /&gt;Разработка игры длилась суммарно около 10ти дней, большинство из которых я ещё и ходил на работу. При этом первая половина этого времени была потрачена на написание основного функционала, а вторая — на придумывание и реализацию уровней.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5153761970428545435?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5153761970428545435/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/07/igdc-dembro.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5153761970428545435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5153761970428545435'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/07/igdc-dembro.html' title='Пара слов о том, как делался Maze Journey'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6134608881464053633</id><published>2011-06-15T02:55:00.001+04:00</published><updated>2011-06-15T03:00:09.940+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><category scheme='http://www.blogger.com/atom/ns#' term='разметка'/><title type='text'>m4: временные макросы</title><content type='html'>Часто при использовании m4 может возникнуть необходимость использования локальных определений. Например, в случае языка разметки часто нужно оформлять какие-то списки. Списки бывают разных типов — по оформлению: нумерованный, с кружочками; по применению: оглавление, список литературы. И хочется иметь возможность быстро сменять один тип на другой, т.е. было бы удобно записывать как-то так:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#87af87"&gt;LIST(&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Ананас&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Банан&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокос&lt;/font&gt;&lt;font color="#87af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#87af87"&gt;REFERENCES(&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Энциклопедический словарь Брокгауза и Ефрона: В 86 томах &lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;82 т. и 4 доп.&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#00afaf"&gt;. — СПб.: 1890—1907.&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Перевод главы о бананах из книги Julia F. Morton «Fruits of Warm Climates» 1987&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокосовая пальма — статья из Большой советской энциклопедии&lt;/font&gt;&lt;font color="#87af87"&gt;))&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Здесь в обоих конструкциях используется макрос ITEM, но в разных смыслах: в первом случае он будет раскрыт в нумерованный элемент, во втором — в элемент списка литературы.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Однако, подобный синтаксис реализовать в m4 невозможно. В любых конструкциях сперва вычисляются аргументы (т.е. ITEM'ы), и только после этого вызываются макросы, в которые эти аргументы передаются, т.е. в LIST и REFERENCES. Поэтому LIST и REFERENCES не могут никак повлиять на то, как будут вычисляться ITEM'ы. Как можно было бы обойти это ограничение? Самый простой способ — отказаться от локальных объявлений, а сделать глобальные, но с разными именами:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#87af87"&gt;LIST(&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Ананас&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Банан&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокос&lt;/font&gt;&lt;font color="#87af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#87af87"&gt;REFERENCES(&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;RITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Энциклопедический словарь Брокгауза и Ефрона: В 86 томах &lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;82 т. и 4 доп.&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#00afaf"&gt;. — СПб.: 1890—1907.&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;RITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Перевод главы о бананах из книги Julia F. Morton «Fruits of Warm Climates» 1987&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;RITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокосовая пальма — статья из Большой советской энциклопедии&lt;/font&gt;&lt;font color="#87af87"&gt;))&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Этот метод не очень красив, не очень удобен, и может привести к трудностям, если требуется делать вложенные списки. Вместо этого способа мне больше нравится разделение LIST и REFERENCES на открывающий и закрывающий макросы:&lt;br /&gt;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;br /&gt;&lt;font face="monospace"&gt;LIST&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Ананас&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Банан&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокос&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;_LIST&lt;br /&gt;REFERENCES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Энциклопедический словарь Брокгауза и Ефрона: В 86 томах &lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;82 т. и 4 доп.&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#00afaf"&gt;. — СПб.: 1890—1907.&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Перевод главы о бананах из книги Julia F. Morton «Fruits of Warm Climates» 1987&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокосовая пальма — статья из Большой советской энциклопедии&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;_REFERENCES&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Теперь уже можно внутри REFERENCES ввести своё собственное объявление ITEM'а, а внутри _REFERENCES восстановить старое.&lt;br /&gt;&lt;br /&gt;Создание временных макросов в m4 имеет несколько тонкостей. Во-первых, вместо обычного define следует использовать пару pushdef и popdef. Первый макрос определяет новый макрос, сохраняя все предыдущие, popdef удаляет последнее определение, восстанавливая предыдущие.&lt;br /&gt;&lt;br /&gt;Во-вторых связано с использованием локальных переменных: если записать &lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LIST'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;OL&amp;gt;&lt;/font&gt;&lt;font color="#00afaf"&gt;pushdef(&lt;/font&gt;&lt;font color="#87afaf"&gt;`ITEM'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;LI&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/LI&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;то вместо $* будет подставлен параметр макроса LIST, а не макроса ITEM. Более того, даже если заключить параметр в сколь угодно большое кол-во символов цитирования, всё равно оно будет считаться параметром макроса LIST. Я придумал решение, быть может не очень красивое, но рабочее: нужно сгенерировать текст «$*» вычислением, самый простой способ — конкатенация:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`CONCAT'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#00af87"&gt;$1$2&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`_DS'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#87af87"&gt;CONCAT(&lt;/font&gt;&lt;font color="#00afaf"&gt;$,*&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LIST'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;OL&amp;gt;&lt;/font&gt;&lt;font color="#00afaf"&gt;pushdef(&lt;/font&gt;&lt;font color="#87afaf"&gt;`ITEM'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;LI&amp;gt;_DS&amp;lt;/LI&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`_LIST'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#87af87"&gt;popdef(&lt;/font&gt;&lt;font color="#87afaf"&gt;`ITEM'&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/OL&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;(DS — аббревиатура для Dollar Star).&lt;br /&gt;&lt;br /&gt;Можно аналогичным образом определить макросы _D1, _D2, ..., _D9 для, соответственно, $1, $2, ..., $9.&lt;br /&gt;&lt;br /&gt;Ещё есть красивое решение, которое заключается в написании макросов _S, _1, _2, ..., _9, которые заменяются на, соответственно, *, 1, 2, ..., 9. Тогда «локальные параметры» подмакросов можно будет записывать как $_S, $_1, $_2, ..., $_9.&lt;br /&gt;&lt;br /&gt;Составные конструкции можно ещё усовершенствовать: вместо пар LIST/_LIST, REFERENCES/_REFERENCES можно задавать всего по одному макросу LIST и REFERENCES, внутри которых будет определяться макрос END, определённый аналогичным ITEM'у способом. Этот способ реализован в моём языке разметок, в файлах &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/util.m4"&gt;util.m4&lt;/a&gt; и &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/html.m4"&gt;html.m4&lt;/a&gt; (см. списки и таблицы). В файле &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/examples.m4"&gt;examples.m4&lt;/a&gt; можно посмотреть примеры использования всего этого, а в файле &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/examples.html"&gt;examples.html&lt;/a&gt; то, что из этого сгенерировано: как видно, все списки и таблицы благополучно раскрываются в то, что нужно.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6134608881464053633?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6134608881464053633/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/06/m4_15.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6134608881464053633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6134608881464053633'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/06/m4_15.html' title='m4: временные макросы'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5748443279063885557</id><published>2011-06-14T12:55:00.004+04:00</published><updated>2011-06-14T13:00:44.338+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='блог'/><title type='text'>Починил каты</title><content type='html'>Напомню, что когда-то я настроил в блоге &lt;a href="http://keyfighter.blogspot.com/2009/04/blog-post.html"&gt;каты&lt;/a&gt;, а когда сменил дизайн, они сломались: даже если пост не содержит ката, то на странице со списком всё равно писалось «Читать дальше......».&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Сегодня, спустя более года после поломки, я решил всё починить. Оказалось, что после смены дизайна блоггер удалил всё, что было добавлено в теге head, и после добавления каты снова работают корректно.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5748443279063885557?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5748443279063885557/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/06/blog-post_14.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5748443279063885557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5748443279063885557'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/06/blog-post_14.html' title='Починил каты'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2778431747613183456</id><published>2011-06-14T11:57:00.003+04:00</published><updated>2011-06-14T12:07:26.210+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fpc'/><title type='text'>Менеджер памяти</title><content type='html'>Известно, что если передавать паскалевские строки в/из длл, и ни в чём себя не ограничивать, то прога может упасть. Поэтому при взаимодействии с длл большинство использует строки в стиле Си.&lt;br /&gt;&lt;br /&gt;Наткнулся &lt;a href="http://www.codenet.ru/progr/other/Shared-Memory-FPC.php"&gt;на забавную статью&lt;/a&gt;, предлагающую решение проблемы в случае, если и прога, и длл пишутся вместе. Автор утверждает, что если и у длл, и у программмы установить один менеджер памяти, то проблем не будет. Это стоит ещё проверить, но звучит правдоподобно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2778431747613183456?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2778431747613183456/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2778431747613183456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2778431747613183456'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/06/blog-post.html' title='Менеджер памяти'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1815897012886468254</id><published>2011-06-14T04:31:00.003+04:00</published><updated>2011-06-14T06:07:39.222+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro: классы для исходного кода</title><content type='html'>Выносил из центрального объекта обработку исходного кода. Перемудрил с архитектурой. С первого раза написать хороший код не получилось, вышла большая каша, желание переделывать которую не было. Писать другие части DEmbro не представлялось возможным без этого, поэтому почти полтора месяца (!) я был деморализован и боялся всё переписывать. Недавно, наконец, нашёл в себе силы и осуществил задуманное.&lt;br /&gt;&lt;br /&gt;Я думал, что в коде очень много связности и потребуется долгое переписывание под новую архитектуру, но это оказалось не так, и всё очень быстро встроилось.&lt;br /&gt;&lt;br /&gt;Теперь о самом исходном коде. Его обработка в DEmbro крайне проста: исходный код просматривается в один проход, за время которого часть его сразу исполняется, а часть преобразуется в шитый код, который можно будет выполнить позже. Т.е. никакого препроцессинга, лексического, синтаксического или семантического анализа нету, поэтому весь исходный код хранить целиком в оперативной памяти во многих случаях не нужно.&lt;br /&gt;&lt;br /&gt;За время этого прохода необходимо всего несколько операций: прочитать следующий символ входного потока, прочитать следующее слово (последовательность символов без пробелов) и прочитать всё до определённого ограничителя (например, комментарий пропускает все символы до заданного ограничителя). Возможно, что будут и другие операции, но эти — основные. Написание классов, отвечающих за это, и вынесение в них функционала по обработке исходников, и было одной из задач рефакторинга.&lt;br /&gt;&lt;br /&gt;Самый главный класс — TSource, отвечает за промежуточное хранение исходного кода (последовательности символов) в оперативной памяти, и делегирует выполнение операций с исходным кодом вспомогательным классам. Пока что исходный код хранится только в памяти, и поэтому TSource может хранить в буфере его целиком, но в будущем будет возможность получать исходники и из других мест: из файла, из произвольного потока, по сети и т.д. Идея этого заключается в том, что так как нам не нужно хранить весь исходный код целиком в оперативке, а нужен только небольшой фрагмент, то разумно этим воспользоваться и в качестве бонуса получить малое потребление оперативной памяти. Кроме того, пользуясь особенностями конкретных источников исходника, можно оптимизировать чтение и выиграть в скорости (например, если исходный код приходит по сети, то можно выполнять по мере поступления приходящие куски). Кроме того, TSource должен хранить название источника кода (имя файла, например).&lt;br /&gt;&lt;br /&gt;У этого класса есть два вспомогательных — TSpaceSkipper и TNameReader. Первый, как нетрудно догадаться, нужен для того, чтобы пропускать пробелы. Пока что пробелами считаются символы в диапазоне от 0 до 32, но при необходимости можно будет унаследовать своё поведение. Кроме того, в TSpaceSkipper можно будет добавить функциональность по подсчёту числа пробелов, и этим воспользоваться в DEmbro (например, в языке программирования питон для выделение блоков вместо ограничителей begin...end или {...} используются отступы — что достаточно удобно и наглядно. При записывании уровня игры символами в виде псевдографики проще пользоваться пробелами, чем какими-то другими символами). TNameReader, в свою очередь, читает имена. В имя могут входить только символы не из диапазона от 0 до 32, но можно будет унаследовать класс, который, например, будет воспринимать слова с пробелами, если слово заключено в одинарные кавычки.&lt;br /&gt;&lt;br /&gt;Наконец, есть дополнительный класс — TLineReader. Он выделяет строки, считает номер текущей строки, и позицию в строке. Если это нужно, конечно, — класс можно будет отключить для ускорения работы.&lt;br /&gt;&lt;br /&gt;Вроде как получилось расширяемо и ортогонально, но немного муторно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1815897012886468254?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1815897012886468254/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/06/dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1815897012886468254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1815897012886468254'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/06/dembro.html' title='DEmbro: классы для исходного кода'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-671482996686184295</id><published>2011-06-02T02:52:00.010+04:00</published><updated>2011-06-02T13:28:14.435+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>m4: Универсальный язык разметок</title><content type='html'>Этот пост — небольшая обучалка по m4. Как мне кажется, приведённый ниже пример &lt;br /&gt;хорошо иллюстрирует некоторые базовые принципы использования m4.&lt;br /&gt;&lt;br /&gt;Я весьма часто пишу тексты, и для разметки приходится использовать довольно разный &lt;br /&gt;синтаксис: то html, то LaTex, то google wiki, то bbCode (&lt;b&gt;upd&lt;/b&gt; ещё vkontakte разметку бывает &lt;br /&gt;приходится использовать). Даже html бывает разного вида (например, некоторые блоги &lt;br /&gt;сами вставляют тег br в конце каждой строки).&lt;br /&gt;&lt;br /&gt;Запомнить и набить руку на все эти варианты быстро не получается, да и не особо&lt;br /&gt;хочется, поэтому приходится постоянно лезть в документации и вспоминать как&lt;br /&gt;что-то делается. А хочется иметь какой-то единый синтаксис на все случаи &lt;br /&gt;жизни. Во-первых, тогда можно будет изучить только его. А, во-вторых, написанный &lt;br /&gt;текст можно будет конвертировать сразу в несколько выходных форматов.&lt;br /&gt;&lt;br /&gt;Для обеспечения единого синтаксиса я решил воспользоваться m4, а именно:&lt;br /&gt;текст будет писаться с использованием макросов, а в зависимости от того&lt;br /&gt;какой выходной файл нужно будет получить, эти макросы будут по разному &lt;br /&gt;раскрываться.&lt;br /&gt;&lt;br /&gt;Рассмотрим это на примере HTML и LaTeX. Я создал два файла: html.m4 и tex.m4.&lt;br /&gt;Когда требуется из файла изготовить текст на HTML, то следует вызывать&lt;br /&gt;m4 html.m4 file.m4 &gt; file.html&lt;br /&gt;Если же требуется получить LaTeX, то нужно вызывать&lt;br /&gt;m4 tex.m4 file.m4 &gt; file.tex&lt;br /&gt;&lt;br /&gt;Этот вызов сначала выполнит html.m4 или tex.m4, потом file.m4, сольёт результат вместе и &lt;br /&gt;запишет в file.out. При этом в файлах html.m4 и tex.m4 находится исключительно служебная&lt;br /&gt;информация, и мы не хотим, чтобы из них что-то печаталось. Поэтому в начало &lt;br /&gt;каждого такого файла добавляется строка&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#0087af"&gt;divert&lt;/font&gt;(-1)&lt;/font&gt;&lt;br /&gt;которая весь дальнейший вывод выбрасывает, а в конце файла пишем&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#0087af"&gt;divert&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;после чего вывод будет происходить нормально.&lt;br /&gt;&lt;br /&gt;Приступим, наконец, к написанию макросов. Самое простое — перевод строки.&lt;br /&gt;html.m4:&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`BR'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;BR&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;tex.m4:&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`BR'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`\\'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Я решил, что все макросы будут писаться большими буквами, чтобы было по-меньше&lt;br /&gt;конфликтов имён.&lt;br /&gt;&lt;br /&gt;Перейдём к более сложному макросу: жирный шрифт. Использование такого макроса&lt;br /&gt;будет выглядеть примерно так: &lt;font face="monospace"&gt;&lt;font color="#87af87"&gt;BOLD(&lt;/font&gt;&lt;font color="#00afaf"&gt;жирный шрифт&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;/font&gt;. Для реализации нужно &lt;br /&gt;в теле макроса написать $* — вместо него будет подставлено всё, что находится &lt;br /&gt;между скобочек:&lt;br /&gt;html.m4:&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`BOLD'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;strong&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/strong&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;tex.m4:&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`BOLD'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`\textbf{&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;}'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Далее, запись списков. Я выбрал такой синтаксис:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#87af87"&gt;LIST(&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Ананас&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Манго&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ITEM(&lt;/font&gt;&lt;font color="#00afaf"&gt;Кокос&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Оно создаст соответствующий нумерованный список. Реализация:&lt;br /&gt;html.m4:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LIST'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`&amp;lt;OL&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/OL&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`ITEM'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`&amp;lt;LI&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/LI&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;tex.m4:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;'LIST', &lt;font color="#87afaf"&gt;`\begin{enumerate}&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;\end{enumerate}'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;'ITEM', &lt;font color="#87afaf"&gt;`\item &lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Перейдём к более сложному примеру: ссылки. Ссылки уже требуют двух параметров:&lt;br /&gt;куда ссылается и что отображается. Для получения отдельных параметров вместо $* &lt;br /&gt;следует использовать $1, $2, и т.д. Поэтому реализацию ссылки можно бы было &lt;br /&gt;записать так:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LINK'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;a href=&amp;quot;&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/a&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Но эта конструкция имеет проблему: если написать&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#87af87"&gt;LINK(&lt;/font&gt;&lt;font color="#00afaf"&gt;google.com, Используй гугл перед тем, как задать вопрос, пожалуйста&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;то m4 будет думать, что тут четыре параметра, и второй — «Используй гугл перед тем», &lt;br /&gt;а не вся фраза целиком. Для решения проблемы следует использовать макрос «shift»:&lt;br /&gt;он возвращает все свои параметры, кроме первого.&lt;br /&gt;html.m4&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LINK'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&amp;lt;a href=&amp;quot;&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#0087af"&gt;shift(&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;lt;/a&amp;gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;tex.m4&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`LINK'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`\href{&lt;/font&gt;&lt;font color="#0087af"&gt;shift(&lt;/font&gt;&lt;font color="#00af87"&gt;$*&lt;/font&gt;&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;}{&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;}'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Теперь указанный выше пример сработает корректно.&lt;br /&gt;&lt;br /&gt;Далее — дело техники, уже перечисленного достаточно для реализации многого.&lt;br /&gt;В случае, если при наборе какого-то текста критично то, что макросы для разметки слишком длинные, то легко можно вставить где-то в тексте строки вида:&lt;br /&gt;&lt;font face="monospace"&gt; &lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`B'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`BOLD'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;и использовать краткие варианты макросов, ничего при этом не потеряв.&lt;br /&gt;&lt;br /&gt;Вот мои файлы: &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/html.m4"&gt;html.m4&lt;/a&gt; и &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/source/m4/tex.m4"&gt;tex.m4&lt;/a&gt;. Пока что они не полные и скорее полигон для экспериментов, чем что-то, что я использую в боевых условиях, но со временем эти файлы будут пополняться и совершенствоваться.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-671482996686184295?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/671482996686184295/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/06/m4.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/671482996686184295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/671482996686184295'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/06/m4.html' title='m4: Универсальный язык разметок'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2420173707548900153</id><published>2011-05-26T04:47:00.001+04:00</published><updated>2011-05-26T04:51:55.346+04:00</updated><title type='text'>Реализация полиморфизма</title><content type='html'>Наткнулся на статью &lt;a href="http://www.smalltalk.ru/articles/cpp-is-faster.html"&gt;C++ всегда быстрее Smalltalk?&lt;/a&gt;, в которой в частности утверждается:&lt;br /&gt;&lt;br /&gt;«&lt;…&gt; в C++ виртуальные вызовы происходят косвенным образом через таблицу диспетчеризации виртуальных методов. А, как известно, косвенный вызов является очень дорогостоящим на нынешнем поколении процессоров.&lt;br /&gt;&lt;br /&gt;В динамических языках, в которых полиморфизм не привязан к иерархии классов/интерфейсов, реализация полиморфного вызова осуществляется совершенно другим образом, намного более эффективным.»&lt;br /&gt;&lt;br /&gt;Мне вот теперь интересно, что это за более эффективные реализации, ибо в голову совершенно не приходит никаких идей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2420173707548900153?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2420173707548900153/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2420173707548900153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2420173707548900153'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/05/blog-post.html' title='Реализация полиморфизма'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5610975737264744620</id><published>2011-05-19T02:33:00.003+04:00</published><updated>2011-05-19T03:14:04.434+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dquotes'/><category scheme='http://www.blogger.com/atom/ns#' term='метапаскаль'/><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>Метапаскаль: dquotes</title><content type='html'>Т.к. программировать на паскале приходится часто, чтобы автоматизировать многие вещи я решил по полной задействовать m4.&lt;br /&gt;&lt;br /&gt;Метапаскаль (выдуманный мною термин) — это псевдоязык, компиляция исходников которого происходит в два шага: сначала применяется m4, потом fpc. Причём изначально доступно множество макросов, упрощающих жизнь, и меняющих программирования до неузнаваемости (к примеру, будут макросы для описания классов, методов). Сегодня я занимался «лексической частью» метапаскаля.&lt;br /&gt;&lt;br /&gt;Использование m4 с паскалем имеет серьёзную проблему: ограничитель ' (апостроф) используется в m4 для ограничения цитат, и любая строковая константа паскаля сбивает его с толку.&lt;br /&gt;&lt;br /&gt;Их можно поменять, но подобрать другие удобные символы для m4 мне не удалось (нужно два различных ограничителя слева и справа, по умолчанию используются ` и '). Кроме того, стандартный (и немаленький) комплект библиотек для m4 написан с использованием ` и '.&lt;br /&gt;&lt;br /&gt;Поэтому я решил, что нужно в коде на паскале использовать для строковых констант " вместо ', а перед самой компиляцией конвертировать в исходниках двойную кавычку на одинарную. Собственно, это и делает &lt;a href="http://code.google.com/p/dforth/source/browse/#svn%2Ftrunk%2Fsource%2Ftools"&gt;написанная мною небольшая утилита dquotes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Она содержит множество параметров на многие случаи жизнь. Например, такой вызов&lt;br /&gt;dquotes -r .\ D*.pasq *.pas&lt;br /&gt;рекурсивно обходит все файлы, начиная с текущей директории, и файлы с названием, начинающимся на D и расширением .pasq сконвертирует и сохранит в файл с таким же названием, но расширением .pas&lt;br /&gt;&lt;br /&gt;Можно организовать и обратное преобразование:&lt;br /&gt;dquotes -qq -aq -r .\ D*.pas *.pasq&lt;br /&gt;&lt;br /&gt;Из того, что ещё предстоит сделать: обработка стандартных ввода и вывода (для организации цепочки вычислений наподобии «m4 file.pas4 | dquotes -i &gt; file.pas»).&lt;br /&gt;&lt;br /&gt;В качестве бонуса, утилитка позволяет задать преобразование любого символа в любой другой, задав их хекс-коды. Поэтому попутно можно решить ещё одну проблему: символ $ (доллар) используется в m4 для получения параметров, и конфликтует с $ из паскаля. Поэтому я решил, что хекс-константы в метапаскале будут записываться начиная с &amp;, а при помощи dquotes конвертироваться в стандартные, начинающиеся с $.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5610975737264744620?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5610975737264744620/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dquotes.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5610975737264744620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5610975737264744620'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dquotes.html' title='Метапаскаль: dquotes'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3062120921429686258</id><published>2011-05-05T01:19:00.003+04:00</published><updated>2011-05-05T01:26:17.284+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro: разнесение команд по файлам</title><content type='html'>Вынес команды из центрального файла в тематические. Но кодить теперь, возможно, станет сложнее: если раньше нужную команду я искал в одном файле, то теперь таких файлов 25, и команды распределены весьма условно (не всегда ясно к какой именно категории отнести команду).&lt;br /&gt;&lt;br /&gt;Начинаю разбивать монолитную DEmbro-машину на классы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3062120921429686258?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3062120921429686258/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dembro_05.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3062120921429686258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3062120921429686258'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dembro_05.html' title='DEmbro: разнесение команд по файлам'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3023888592875597125</id><published>2011-05-03T01:33:00.005+04:00</published><updated>2011-05-03T01:54:56.051+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro: начало глобального рефакторинга</title><content type='html'>В последнее время изменять ядро DEmbro стало достаточно сложно. Почти каждая правка порождает долгую отладку. Основная причина ­­­­­-- плохо структурированный код, большое число дублирующего кода, неправильно принятые в прошлом решения, которые сразу себя не проявляют, но могут конфликтовать с принятыми позднее решениями. В основном так получилось потому, что раньше я многое не понимал (не мог понять или ленился понять), и потому структурировать код и разбивать его на правильные части было сложно.&lt;br /&gt;&lt;br /&gt;Весь код ядра практически находится в одном файле, содержащем 6600+ строк. После раскрытия макросов при помощи m4 получается 12400+ строк чистого паскаля, некоторые из которых напоминают спрессованный мусор:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;uint64_divmod (Machine: TForthMachine; Command: PForthCommand); &lt;font color="#0087af"&gt;begin&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;with&lt;/font&gt;&amp;nbsp;Machine^ &lt;font color="#0087af"&gt;do&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&amp;nbsp;TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;0&lt;/font&gt;))^)) := TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;-2&lt;/font&gt;*&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) &lt;font color="#0087af"&gt;mod&lt;/font&gt;&amp;nbsp;TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (-&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;-2&lt;/font&gt;*&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) := TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;-2&lt;/font&gt;*&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) &lt;font color="#0087af"&gt;div&lt;/font&gt;&amp;nbsp;TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (-&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^));&lt;br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (-&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) := TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;0&lt;/font&gt;))^));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;; &lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;uint64_shl (Machine: TForthMachine; Command: PForthCommand); &lt;font color="#0087af"&gt;begin&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;with&lt;/font&gt;&amp;nbsp;Machine^ &lt;font color="#0087af"&gt;do&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&amp;nbsp;&lt;font color="#00afaf"&gt;Dec&lt;/font&gt;(WP, &lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (-&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) := TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (-&lt;font color="#00afaf"&gt;SizeOf&lt;/font&gt;(TUInt64)))^)) &lt;font color="#0087af"&gt;shl&lt;/font&gt;&amp;nbsp;TUInt64((&lt;font color="#87af87"&gt;Pointer&lt;/font&gt;(TUInt(Machine.WP) + (&lt;font color="#87afaf"&gt;0&lt;/font&gt;))^))&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;; &lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Я уже достаточно многое понял, и потому назрел глобальный рефакторинг. Первое, что я сделал, -- вынес из этого файла некоторые реализации команд DEmbro, раскидав их по тематическим файлам (20 получилось пока что). В результате число строк в файле удалось сократить с 6600+ до 3900+. После раскрытия макросов размер не сильно изменился, потому что я выносил команды, слабо использующие макросы.&lt;br /&gt;&lt;br /&gt;Впереди я планирую вынести все команды DEmbro из центрального файла в тематические, а потом начну уже разбивать саму DEmbro-машину на части.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3023888592875597125?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3023888592875597125/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3023888592875597125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3023888592875597125'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/05/dembro.html' title='DEmbro: начало глобального рефакторинга'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2534714545585021013</id><published>2011-04-10T23:39:00.004+04:00</published><updated>2011-04-11T00:55:12.091+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>m4: добавление префиксов и автогенерация setter/getter методов</title><content type='html'>Часто в программе к некоторым переменным класса удобно выдать прямой доступ (только на чтение или и на чтение, и на запись). Если в языке нет механизма для автоматической генерации такого доступа, то приходится писать getter и setter методы, которые обеспечивают доступ к переменной.&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;class&lt;/font&gt;&amp;nbsp;Student {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;private&lt;/font&gt;&amp;nbsp;String name ; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;String getName()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;return&lt;/font&gt;&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;protected&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;int&lt;/font&gt;&amp;nbsp;age = &lt;font color="#87afaf"&gt;18&lt;/font&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;int&lt;/font&gt;&amp;nbsp;getAge()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;return&lt;/font&gt;&amp;nbsp;age; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;protected&lt;/font&gt;&amp;nbsp;CatOrDogName favoriteCatOrDog ; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;CatOrDogName getFavoriteCatOrDog()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;return&lt;/font&gt;&amp;nbsp;favoriteCatOrDog; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;void&lt;/font&gt;&amp;nbsp;setFavoriteCatOrDog(CatOrDogName newFavoriteCatOrDog)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;favoriteCatOrDog = newFavoriteCatOrDog; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Писать для всех переменных такие getter/setter методы может быть весьма утомительно. Предлагаю решение для автоматизации этого процесса при помощи макропроцессора m4.&lt;br /&gt;&lt;br /&gt;Первое, что нужно сделать, — написать макрос для добавления префиксов к идентификатору. Поля и методы в данном случае именуются слитными фразами, первое слово пишется маленькими буквами, у каждого следующего заглавная только первая буква. Чтобы к такому идентификатору добавить префикс, нужно поднять первую букву и сложить две строки.&lt;br /&gt;&lt;br /&gt;Объявим макрос для сложения двух его параметров:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`CONCAT'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#00af87"&gt;$1$2&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Тут всё предельно просто — возвращаем первый и второй параметры, пристыкованные вместе. Теперь напишем макрос для поднятия всех символов в строке. Для этого я задействую макрос translit. В качестве первого параметра он принимает строку, в качестве второго параметра — набор символов, и в качестве третьего параметра — ещё один набор символов. Каждый встреченный в строке символ из первого набора будет заменён на соответствующий символ из второго набора. Наборы можно указывать разными способами, я не особо в них вникал, а воспользовался примерами из документации. Наш макрос будет выглядеть так:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`UPCASE'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#0087af"&gt;translit(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;, &lt;font color="#87afaf"&gt;`a-z'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`A-Z'&lt;/font&gt;&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Теперь напишем макрос, который поднимает только первый символ входящего параметра. Для этого задействуем ещё три макроса: len(s) возвращает длину переданной строки, substr(s, first, count) извлекает из строки фрагмент длиной count, начинающийся с символа номер first (нумерация символов с нуля), и, наконец, eval вычисляет арифметическое выражение.&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`FIRSTUP'&lt;/font&gt;,&amp;nbsp;&amp;nbsp; &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#87af87"&gt;CONCAT(UPCASE(&lt;/font&gt;&lt;font color="#0087af"&gt;substr(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;,0,1&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0087af"&gt;substr(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;,1,&lt;font color="#0087af"&gt;eval(len(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#0087af"&gt;)&lt;/font&gt;&amp;nbsp;- 1&lt;font color="#0087af"&gt;))&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Например, если теперь написать &lt;br /&gt;FIRSTUP(veryLongName)&lt;br /&gt;, то оно будет заменено на&lt;br /&gt;VeryLongName&lt;br /&gt;&lt;br /&gt;Осталось совсем немного для макроса, добавляющего префикс:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`ADDPREFIX'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#87af87"&gt;CONCAT(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#00afaf"&gt;,&lt;/font&gt;&lt;font color="#87af87"&gt;FIRSTUP(&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;))&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Теперь перейдём к основной задаче. Я решил ввести следующие макросы:&lt;br /&gt;PRIVATE(type, name, after) — поле приватное, для него определяется публичный геттер&lt;br /&gt;PROTECTED(type, name, after) — доступ к полю наследуется, для него определяется публичный геттер&lt;br /&gt;PUBLIC(type, name, after) — доступ к полю наследуется (но не публичен), для него определяются публичные геттер и сеттер. &lt;br /&gt;&lt;br /&gt;Третий параметр after всех этих макросов нужен для написания явной инициализации полей. Реализация этих макросов технически проста:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`PRIVATE'&lt;/font&gt;, &lt;br /&gt;&lt;font color="#87afaf"&gt;`&amp;nbsp;&amp;nbsp;private &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$3&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`get'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;()&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;{ &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`PROTECTED'&lt;/font&gt;, &lt;br /&gt;&lt;font color="#87afaf"&gt;`&amp;nbsp;&amp;nbsp;protected &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$3&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`get'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;()&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;{ &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`PUBLIC'&lt;/font&gt;, &lt;br /&gt;&lt;font color="#87afaf"&gt;`&amp;nbsp;&amp;nbsp;protected &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$3&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`get'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;()&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;{ &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void &lt;/font&gt;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`set'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`new'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;{ &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;= &lt;/font&gt;&lt;font color="#87af87"&gt;ADDPREFIX(&lt;/font&gt;&lt;font color="#87afaf"&gt;`new'&lt;/font&gt;&lt;font color="#00afaf"&gt;, &lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87af87"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;; &lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Самый первый пример в этом посте теперь можно сгенерировать следующим кодом:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#87af87"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;class&lt;/font&gt;&amp;nbsp;Student {&lt;br /&gt;&amp;nbsp;&amp;nbsp;PRIVATE(String, name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;PROTECTED(&lt;font color="#87af87"&gt;int&lt;/font&gt;, age, = &lt;font color="#87afaf"&gt;18&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;PUBLIC(CatOrDogName, favoriteCatOrDog)&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Для красоты макросы PRIVATE, PROTECTED и PUBLIC я записал в несколько строк. Однако, на практике бывает полезно, чтобы компилятор выдавал строку с ошибкой в изначальном файле (а не в сгенерированном), для этого полезно записать определение этих макросов в одну строку.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2534714545585021013?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2534714545585021013/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/04/m4-settergetter.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2534714545585021013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2534714545585021013'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/04/m4-settergetter.html' title='m4: добавление префиксов и автогенерация setter/getter методов'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6651352062486620214</id><published>2011-04-06T13:00:00.004+04:00</published><updated>2011-04-06T13:46:46.135+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Оператор switch</title><content type='html'>Добавил &lt;a href="http://code.google.com/p/dforth/wiki/article_switch"&gt;оператор switch&lt;/a&gt;. До сих пор, правда, был лишь один случай, когда он был нужен (обработка windows-сообщений).&lt;br /&gt;&lt;br /&gt;Трудно писать документацию на команды (вообще и на switch в частности). Не лениво, а непонятно как. Я без проблем могу объяснять как это использовать на практике, но что это и как это устроено, описать в несколько понятных абзацев не получается. А это в документации нужно описать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6651352062486620214?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6651352062486620214/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/04/switch.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6651352062486620214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6651352062486620214'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/04/switch.html' title='Оператор switch'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3079231932076762487</id><published>2011-04-06T12:33:00.005+04:00</published><updated>2011-04-25T12:40:20.859+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Локальные переменные</title><content type='html'>Вчера исправил баг в ядре, который мешал в полной мере заработать&lt;br /&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/statements/locals.de"&gt;локальным переменным&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Простые локальные переменные (типы int, uint, bool, ptr) объявляются так &lt;br /&gt;(внутри команды):&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#8700d7"&gt;| l1 l2 ... ln|&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;Они сразу снимают со стека начальные значения, к примеру после&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;3&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;| i j k|&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;в i окажется значение 1, в j окажется значение 2, в k окажется значение 3.&lt;br /&gt;&lt;br /&gt;Чтение/запись переменных стилизовано под классический фортовский стиль. Если &lt;br /&gt;name — название локальной переменной, то для неё определяются следующие команды&lt;br /&gt;&lt;OL&gt;&lt;br /&gt; &lt;LI&gt; name@ — прочитать значение переменной, положить его на стек&lt;br /&gt; &lt;LI&gt; name! — записать в name значение со стека&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;br /&gt;Помимо этих двух примитивных операций, определяются следующие сахарные:&lt;br /&gt;&lt;OL&gt;&lt;br /&gt; &lt;LI&gt; name1+ — увеличить значение name на 1&lt;br /&gt; &lt;LI&gt; name1- — уменьшить значение name на 1&lt;br /&gt; &lt;LI&gt; name++ — положить значение name на стек и увеличить name на 1&lt;br /&gt; &lt;LI&gt; ++name — увеличить name на 1 и положить результат на стек&lt;br /&gt; &lt;LI&gt; name-- — положить значение name на стек и уменьшить name на 1 &lt;br /&gt; &lt;LI&gt; --name — уменьшить name на 1 и положить результат на стек &lt;br /&gt; &lt;LI&gt; name+  — прибавить name к вершине стека&lt;br /&gt; &lt;LI&gt; name-  — вычесть name из вершины стека &lt;br /&gt; &lt;LI&gt; name*  — умножить вершину стека на name&lt;br /&gt; &lt;LI&gt; name+! — прибавить к переменной name значение с вершины стека&lt;br /&gt; &lt;LI&gt; name-! — вычесть из вершины стека name и положить результат в name&lt;br /&gt; &lt;LI&gt; name*! — умножить name на значение с вершины стека&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;br /&gt;Можно при необходимости добавить собственные операции с локальными переменными,&lt;br /&gt;изменив по стандартной схеме &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/statements/locals.de"&gt;файл, в котором локальные переменные реализованы&lt;/a&gt;.&lt;br /&gt;Планируются и другие конструкции локальных переменных (для строк, для классов).&lt;br /&gt;&lt;br /&gt;Несколько примеров использования локальных переменных:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#8787af"&gt;// Функция Result = (a + b) * (b + c) * (c + a)&lt;/font&gt;&lt;br /&gt;&lt;font color="#8700d7"&gt;: func&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;| a b c|&lt;/font&gt;&amp;nbsp;a@ b+ b@ c+ &lt;font color="#00afaf"&gt;c@&lt;/font&gt;&amp;nbsp;a+ &lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#8787af"&gt;// Команда, печатающая числа от 100 до 1&lt;/font&gt;&lt;br /&gt;&lt;font color="#8700d7"&gt;: test&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;101&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;| i|&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&amp;nbsp;--i &lt;font color="#0087af"&gt;while&lt;/font&gt;&amp;nbsp;i@ &lt;font color="#87afaf"&gt;.&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;repeat&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3079231932076762487?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3079231932076762487/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/04/blog-post_06.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3079231932076762487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3079231932076762487'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/04/blog-post_06.html' title='Локальные переменные'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-728829014686057107</id><published>2011-04-02T00:11:00.002+04:00</published><updated>2011-04-02T00:15:52.996+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='концепция'/><title type='text'>Контекстные параметры</title><content type='html'>Часто в программе существуют объекты-менеджеры. Например, гуи-менеджер — объект,&lt;br /&gt;при помощи которого осуществляется управление кнопками, окошками, полями ввода&lt;br /&gt;и т.д. Чтобы создать кнопку, нужно указать в каком именно гуи-менеджере создаём.&lt;br /&gt;Чтобы установить кнопке стиль, нужно этот стиль получить из гуи-менеджера.&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;Button := GuiManager.CreateButton;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Button.SetStyle(GuiManager.GetStyle(&lt;font color="#87afaf"&gt;'glamur'&lt;/font&gt;));&lt;/font&gt;&lt;br /&gt;При этом в 99% программ название переменной (или свойства), содержащей ссылку на&lt;br /&gt;менеджера, будет называться именно GuiManager.&lt;br /&gt;&lt;br /&gt;Поэтому возникает естественное желание организовать всё так, чтобы GuiManager&lt;br /&gt;не прописывать в вызовах вручную, а как-то автоматически подставлять.&lt;br /&gt;&lt;br /&gt;Самое тупое решение — создать глобальную переменную GuiManager и пусть к ней&lt;br /&gt;обращаются функции CreateButton, GetStyle и прочие. А что если в программе&lt;br /&gt;нужно работать с несколькими менеджерами? Нужно просто в нужные моменты&lt;br /&gt;менять значение глобальной переменной. Что делать, если нужно работать с&lt;br /&gt;разными менеджерами из разных потоков? Переписать GuiManager с глобальной&lt;br /&gt;переменной под зависящую от потока.&lt;br /&gt;&lt;br /&gt;Хоть этот метод и решает поставленную задачу, он мне не нравится. Вместо него&lt;br /&gt;напрашивается концепция «контекстных параметров». Её мне не удалось реализовать&lt;br /&gt;на паскале, но я надеюсь, что получится реализовать в Lisp'е и DEmbro.&lt;br /&gt;&lt;br /&gt;Идея вот в чём: у функции мы выделяем некоторый набор параметров и объявляем их&lt;br /&gt;контекстными. Например:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;CreateButton(&lt;font color="#0087af"&gt;context&lt;/font&gt;&amp;nbsp;GuiManager: TGuiManager): TGuiButton;&lt;/font&gt;&lt;br /&gt;Здесь мы указали, что параметр GuiManager контекстный. От этого мы не теряем&lt;br /&gt;возможностей, функцию можно вызвать обычным образом:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;Button := CreateButton(GuiManager);&lt;/font&gt;&lt;br /&gt;при этом выполнится она так же, как и обычная функция. &lt;br /&gt;&lt;br /&gt;Отличие заключается в возможности опустить передачу параметра:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;Button := CreateButton();&lt;/font&gt;&lt;br /&gt;При этом компилятор автоматически подставит GuiManager внутрь, обратившись&lt;br /&gt;к идентификатору в текущей области видимости. Т.е.&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;DoSomething(GuiManager: TGuiManager);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;DoSomethingDeep;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;var&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GuiManager: TGuiManager;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button := CreateButton(); &lt;font color="#8787af"&gt;// в CreateButton передастся локальная переменная&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// функции DoSomethingDeep&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button := CreateButton(); &lt;font color="#8787af"&gt;// в CreateButton передастся параметр &lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// функции DoSomething&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Может даже так получится, что GuiManager — это функция, сама содержащая&lt;br /&gt;контекстный параметр:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;var&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;App: TApp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;GuiManager(&lt;font color="#0087af"&gt;context&lt;/font&gt;&amp;nbsp;App: TApp): TGuiManager;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;Result&lt;/font&gt;&amp;nbsp;:= App.GuiManager;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Button := CreateButton(); &lt;font color="#8787af"&gt;// эквивалентно CreateButton(GuiManager(App))&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь несколько слов о возможном синтаксисе в паскаль-семействе. Контекстные&lt;br /&gt;параметры поведением очень похожи на параметры со значением по умолчанию. Чтобы&lt;br /&gt;подчеркнуть это, возможно, что имеет смысл заменить синтаксис, использованный выше, на&lt;br /&gt;такой:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;CreateButton(GuiManager: TGuiManager = &lt;font color="#0087af"&gt;context&lt;/font&gt;): TGuiButton;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-728829014686057107?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/728829014686057107/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/728829014686057107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/728829014686057107'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/04/blog-post.html' title='Контекстные параметры'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8400102122687541802</id><published>2011-03-30T07:12:00.003+04:00</published><updated>2011-03-30T07:30:52.198+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='проблемы'/><title type='text'>SetPixelFormat 3221684230</title><content type='html'>Пытаюсь написать на DEmbro OpenGL-приложение.&lt;br /&gt;&lt;br /&gt;Функция SetPixelFormat возвращает ошибку, GetLastError сообщет, что это ошибка C0070006 (или 3221684230 в decimal), а после чтения форумов узнал, что эта ошибка возникает в системе с nVidia видеокартой, если handle окна не принадлежит процессу (или процесс не имеет должных прав).&lt;br /&gt;&lt;br /&gt;Это весьма печально, потому что я не понимаю, почему так должно получаться. Если написать на паскале соответствующий код, то всё будет нормально. Код на DEmbro ничем особым с точки зрения системы отличаться не должен. Единственное отличие -- то, что вызов системных функций происходит из асм кода, и тут что-то могло всплыть с правами, но эта теория выглядит не убедительно.&lt;br /&gt;&lt;br /&gt;Самое обидное, что эта ошибка возникает именно в OpenGL и именно с nVidia-видеокартой. Т.е. если бы я использовал DirectX или ATI-видеокарту, то такой ошибки не возникло бы.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[UPDATE]&lt;/span&gt; Ура, справился с этим. Всегда так получается, что пока я наедине с собой ищу ошибку несколько часов, ничего не выходит. Как только опишу её кому-то — сразу осеняет и проблема решается. Пора спать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8400102122687541802?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8400102122687541802/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/03/setpixelformat-3221684230.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8400102122687541802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8400102122687541802'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/03/setpixelformat-3221684230.html' title='SetPixelFormat 3221684230'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7951664548618603467</id><published>2011-03-20T19:34:00.001+03:00</published><updated>2011-03-20T19:35:48.645+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro: документация, плавающая точка, и конфигурируемость</title><content type='html'>Написал программу, генерирующую &lt;a href="http://code.google.com/p/dforth/wiki/doc"&gt;хелп в вики&lt;/a&gt; из документации в исходниках. Теперь&lt;br /&gt;я могу прямо под функцией в коде описать что она делает, и потом документация&lt;br /&gt;на неё автоматически может быть сгенерирвана в нужный формат. В дальнейшем можно&lt;br /&gt;будет писать документации сразу на нескольких языках.&lt;br /&gt;&lt;br /&gt;Пока что с самой документацией бардка, не успел ещё всё оформить.&lt;br /&gt;&lt;br /&gt;Решил, что для чисел с плавающей точкой тоже, как и строкам, нужен отдельный стек.&lt;br /&gt;В качестве этого отдельного стека я выбрал стек сопроцессора — получилось так,&lt;br /&gt;программирование плавающих вычислений на DEmbro почти эквивалентно программированию&lt;br /&gt;на ассемблере. Может показаться, что это как-то что-то усложняет, но это не так —&lt;br /&gt;ассемблер сопроцессора очень гармонично вписывается в стековый стиль &lt;br /&gt;программирования на DEmbro.&lt;br /&gt;&lt;br /&gt;Осуществил свою главную задумку: теперь при создании DEmbro-машины доступно около&lt;br /&gt;четырёх команд. Две из них служат для того, чтобы подключить остальные встроенные&lt;br /&gt;команды. Это позволяет программисту самому решить какое подмножество команд DEmbro&lt;br /&gt;выбрать для программирования. По умолчанию подключается файл «system.de», который&lt;br /&gt;подключает весь функционал ядра.&lt;br /&gt;&lt;br /&gt;Образцовым теперь выглядит &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/core/f.de"&gt;файл для плавающих вычислений&lt;/a&gt; — он подключает команды&lt;br /&gt;ядра, тут же содержит документацию на эти команды (не на все, но это вопрос &lt;br /&gt;времени), и реализует недостающие полезные команды.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7951664548618603467?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7951664548618603467/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/03/dembro_406.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7951664548618603467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7951664548618603467'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/03/dembro_406.html' title='DEmbro: документация, плавающая точка, и конфигурируемость'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-9186538175038080855</id><published>2011-03-01T21:03:00.005+03:00</published><updated>2011-03-01T21:12:30.166+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Простейшие примеры работы со строками</title><content type='html'>Всё перечисленное уже работает, за исключением unicode-&gt;cp1251.&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;&amp;quot; &lt;/font&gt;&lt;font color="#87afaf"&gt;expe&lt;/font&gt;&lt;font color="#0087af"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;&amp;quot; &lt;/font&gt;&lt;font color="#87afaf"&gt;rience&lt;/font&gt;&lt;font color="#0087af"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;str+ &lt;font color="#8787af"&gt;// сложили две строки, получили experience&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;4&lt;/font&gt;&amp;nbsp;str-cut &lt;font color="#8787af"&gt;// оставили четыре символа, начиная со второго, получили peri (нумерация с нуля)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;bdup&lt;/font&gt;&amp;nbsp;str+ &lt;font color="#8787af"&gt;// сложили строку с самой собой, получили periperi&lt;/font&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;&amp;quot; &lt;/font&gt;&lt;font color="#87afaf"&gt;rip&lt;/font&gt;&lt;font color="#0087af"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;str^ &lt;font color="#8787af"&gt;// определяем символ, начиная с которого идёт первое вхождение rip в строке, получаем число 2&lt;/font&gt;&lt;br /&gt;str# &lt;font color="#8787af"&gt;// узнали длину строки rip, т.е. 3&lt;/font&gt;&lt;br /&gt;&lt;font color="#8787af"&gt;// Итого, на обычном стеке: 2 3&lt;/font&gt;&lt;br /&gt;&lt;font color="#8787af"&gt;// На стеке строк: &amp;quot; periperi&amp;quot; &amp;quot; rip&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;bdrop&lt;/font&gt;&amp;nbsp;&lt;font color="#8787af"&gt;// скидывем строку rip со стека&lt;/font&gt;&lt;br /&gt;str-del &lt;font color="#8787af"&gt;// удаляем три символа, начиная со второго, получаем peeri&lt;/font&gt;&lt;br /&gt;utf8-&amp;gt;unicode unicode-&amp;gt;cp1251 &lt;font color="#8787af"&gt;// перекодировываем строку из utf8 в cp1251&lt;/font&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;&amp;quot; &lt;/font&gt;&lt;font color="#87afaf"&gt;peeri&lt;/font&gt;&lt;font color="#0087af"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;str= &lt;font color="#8787af"&gt;// проверяем равны ли строки, в данном случае получаем true&lt;/font&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;.&amp;quot; &lt;/font&gt;&lt;font color="#87afaf"&gt;Hello world!&lt;/font&gt;&lt;font color="#0087af"&gt;&amp;quot;cr&lt;/font&gt;&amp;nbsp;&lt;font color="#8787af"&gt;// печатаем на консоль строку&lt;/font&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-9186538175038080855?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/9186538175038080855/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/03/dembro.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/9186538175038080855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/9186538175038080855'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/03/dembro.html' title='Простейшие примеры работы со строками'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6740993442872306134</id><published>2011-02-28T04:23:00.006+03:00</published><updated>2011-02-28T05:32:46.244+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DEmbro: стек блоков (для строк)</title><content type='html'>24 дня (почти месяц) DEmbro был в ауте в связи с глобальным переписыванием ядра для поддержки отдельного стека для строк. Переписывание закончено, и теперь, фактически, получился немного другой язык.&lt;br /&gt;&lt;br /&gt;Необходимость отдельного стека исходила из двух желаний &lt;br /&gt;1) Сделать поддержку человечных строк (т.е. чтобы не нужно было заморачиваться с ручным отслеживанием за выделенной памятью, как в случае со строками с завершающим нулём), и можно было бы делать со строками всё что угодно: складывать, искать подстроки, вырезать участки и т.д.&lt;br /&gt;2) Сохранить приличную скорость, характерную статически типизируемым языкам.&lt;br /&gt;&lt;br /&gt;До недавнего времени я хранил строки в одном стеке с числами и указателями. Чтобы при копировании строк не копировать все символы (что является ИМХО не лучшей идеей, т.к. строка может занимать память неограниченно большого размера), в строке хранится счётчик ссылок на неё. Как только счётчик обнуляется, строка освобождается.&lt;br /&gt;&lt;br /&gt;И тут начинается много проблем. Одна из самых существенных — при перехвате исключения, когда стек возвращается к некоторому исходному состоянию, нет возможности отследить где на стеке строки, а где числа (типы элементов стека нигде не хранятся, иначе это замедлило бы работу). Строки утекут, написать корректные исключения не представляется возможным.&lt;br /&gt;&lt;br /&gt;С отдельным стеком эта проблема решается легко: нужно при срабатывании исключения откатить строковый стек, скинув у каждой лишней строки ссылку. Кроме того, в качестве бонуса, с новым стеком код стал заметно проще: существенно сократилось число манипуляций с основным стеком.&lt;br /&gt;&lt;br /&gt;Кстати говоря, в этом же стеке будут находиться не только строки, но и любые другие элементарные типы переменной длины: длинные числа, например.&lt;br /&gt;&lt;br /&gt;Из других нововведений появились:&lt;br /&gt;1) Поддержка пространств имён (namespaces)&lt;br /&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/core/voc.de#9"&gt;http://code.google.com/p/dforth/source/browse/trunk/release/units/core/voc.de#9&lt;/a&gt;&lt;br /&gt;2) Возможность написания документации к командам непосредственно в исходном коде при помощи ключевых слов summary и detail:&lt;br /&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/utils/parser.de"&gt;http://code.google.com/p/dforth/source/browse/trunk/release/units/utils/parser.de&lt;/a&gt;&lt;br /&gt;В REPL режиме на основе этого можно запрашивать инфу о командах при помощи вызова «help command», а в дальнейшем из этих же данных будет генерироваться документация в вики. Планируется сделать поддержку возможности написания документации на нескольких языках (что необходимо как минимум для функций из rtl).&lt;br /&gt;&lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/core/help.de#38"&gt;http://code.google.com/p/dforth/source/browse/trunk/release/units/core/help.de#38&lt;/a&gt;&lt;br /&gt;3) Поддержка строк произвольной кодировки, для этого строка может быть в одном из трёх состояний: ansi/wide/unicode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6740993442872306134?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6740993442872306134/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/02/dembro.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6740993442872306134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6740993442872306134'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/02/dembro.html' title='DEmbro: стек блоков (для строк)'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7701624560289261607</id><published>2011-02-15T02:54:00.000+03:00</published><updated>2011-02-15T02:55:21.543+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmd'/><title type='text'>Кодировки в названиях файлов</title><content type='html'>Допустим, что в папке большое число файлов в неправильной кодировке, и вам нужно &lt;br /&gt;найти какой-то файл. (Например, с такой проблемой вы столкнулись в папке &lt;br /&gt;с фильмами в локальной сети.)&lt;br /&gt;&lt;br /&gt;В уме догадываться как что называется — не вариант. Можно воспользоваться &lt;br /&gt;командой dir: набираем&lt;br /&gt;dir путь_до_папки &gt; имя_какого-то_файла&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;dir \\172.16.0.22\Video\Films\ &gt; d:\films.txt&lt;br /&gt;&lt;br /&gt;После выполнения этой команды в файле films.txt окажется список всех файлов, а &lt;br /&gt;его уже можно &lt;a href="http://keyfighter.blogspot.com/2010/12/blog-post_18.html"&gt;переконвертировать в своём любимом редакторе в нужную кодировку&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7701624560289261607?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7701624560289261607/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/02/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7701624560289261607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7701624560289261607'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/02/blog-post.html' title='Кодировки в названиях файлов'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-5233337565624545628</id><published>2011-01-02T18:26:00.003+03:00</published><updated>2011-01-02T18:39:53.770+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Callbacks в DEmbro</title><content type='html'>Отлаживал последние полмесяца с перерывом на зачётную сессию возможность создания в программе на DEmbro коллбэков, т.е. функций, которые можно передавать во внешний мир. Пока что узкий круг функций (stdcall, каждый параметр и возвращаемое значение занимают 4 байта), но зато поддерживается, ура!&lt;br /&gt;&lt;br /&gt;Проделана большая работа. Т.е. «функции» DEmbro несовместимы с обычными функциями в системе, для их поддержки требуется генерировать на лету машинный код-переходник, который перекладывает с системного стека параметры на стек параметров DEmbro. Очень много времени я потратил в Hex-редакторе, отлаживая генерируемый машинный код, теперь в нём даже немного могу увидеть ассемблерный код и отличаю «8b» от «b8».&lt;br /&gt;&lt;br /&gt;Результатом этого стала &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/examples/Window.de"&gt;программа&lt;/a&gt;, благополучно создающая окно в винде на чистом WinApi. Это означает, что уже возможно писать WinApi, OpenGL и прочие, не требующие каких-то сложных спец. возможностей, приложения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-5233337565624545628?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/5233337565624545628/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2011/01/callbacks-dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5233337565624545628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/5233337565624545628'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2011/01/callbacks-dembro.html' title='Callbacks в DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1878845898270501257</id><published>2010-12-18T04:42:00.007+03:00</published><updated>2011-11-24T12:40:18.636+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Кодировки в vim'е (в том числе koi8-r для windows)</title><content type='html'>Часто приходится сталкиваться с файлами в разных кодировках.&lt;br /&gt;&lt;br /&gt;Если Вы открыли файл в виме и увидели вместо русских букв закорючки, &lt;br /&gt;то скорее всего файл отображается в неверной кодировке. Чтобы вручную &lt;br /&gt;выставить кодировку, следует набрать&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;:&lt;span style="color: #0087af;"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;++&lt;/span&gt;enc&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;название_кодировки&lt;/span&gt;&lt;br /&gt;Вот некоторые из возможных кодировок для кириллицы:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;cp688 — основная DOS-кодировка&lt;/li&gt;&lt;li&gt;cp1251 — основная Windows-кодировка&lt;/li&gt;&lt;li&gt;utf-8 — UTF8-кодировка&lt;/li&gt;&lt;li&gt;koi8-r — основная Linux-кодировка&lt;/li&gt;&lt;/ol&gt;Более полный список см. «:help encoding-names».&lt;br /&gt;&lt;br /&gt;Если вы используете windows, то «koi8-r» изначально не поддерживается. Чтобы &lt;br /&gt;исправить это, следует скачать файл «iconv.dll» и кинуть в папку с exe'шником&lt;br /&gt;вима (я качал &lt;a href="http://yukihiro.nakadaira.googlepages.com/win_iconv.zip"&gt;отсюда&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Предположим другую ситуацию: вам нужно сохранить файл, перекодировав его в &lt;br /&gt;другую кодировку. Для этого можно воспользоваться опцией «fileencoding»:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;:&lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;fileencoding&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;название_кодировки&lt;/span&gt;&lt;br /&gt;или же&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;:&lt;span style="color: #0087af;"&gt;w&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0087af;"&gt;++&lt;/span&gt;enc&lt;span style="color: #0087af;"&gt;=&lt;/span&gt;название_кодировки имя_выходного_файла&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Часто приходится работать с разными файлами, и хочется, чтобы&lt;br /&gt;вим пытался при запуске как-то выбрать наиболее подходящую кодировку &lt;br /&gt;из нескольких. Достигается это прописыванием опции «fileencodings» в файле&lt;br /&gt;«.vimrc». К примеру, у меня прописано так:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0087af;"&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8700d7;"&gt;fileencodings&lt;/span&gt;=utf-8&lt;span style="color: #0087af;"&gt;,&lt;/span&gt;cp1251&lt;/span&gt;&lt;br /&gt;Это означает, что вим попытается отобразить файл как utf-8, а если не получится,&lt;br /&gt;то отобразит в cp1251.&lt;br /&gt;&lt;br /&gt;Узнать список поддерживаемых кодировок можно вызовом&lt;br /&gt;help encoding-names&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1878845898270501257?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1878845898270501257/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/12/blog-post_18.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1878845898270501257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1878845898270501257'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/12/blog-post_18.html' title='Кодировки в vim&apos;е (в том числе koi8-r для windows)'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6775014680138021722</id><published>2010-12-06T15:57:00.001+03:00</published><updated>2010-12-06T16:01:07.661+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Подключение библиотек</title><content type='html'>Написал в DEmbro поддержку механизма подключения внешних библиотек с защитой от&lt;br /&gt;повторов, оформил это &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/core/includes.de"&gt;в виде библиотеки&lt;/a&gt; :) Сейчас я уже на той стадии, когда&lt;br /&gt;начинаю потихоньку писать RTL со всякими полезными вещами.&lt;br /&gt;&lt;br /&gt;Вообще, хочу всё вынести в RTL, и оставить изначально всего одну команлу: &lt;br /&gt;«builtin». Она будет подключать в программу встроенные в язык команды, &lt;br /&gt;например, вот так:&lt;br /&gt;builtin +&lt;br /&gt;builtin -&lt;br /&gt;builtin create&lt;br /&gt;&lt;br /&gt;По умолчанию будет загружаться стандартный «system.de» файл, который будет&lt;br /&gt;подключать все встроенные команды. Но их много, поэтому будет возможность написать &lt;br /&gt;свой system.de, содержащий в себе необходимый для поставленной задачи &lt;br /&gt;комплект. Это позволит мне не скупиться на встроенных «быстрых» (на машинных кодах) &lt;br /&gt;командах, а с другой стороны будет возможность убрать всё ненужное.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6775014680138021722?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6775014680138021722/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6775014680138021722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6775014680138021722'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/12/blog-post.html' title='Подключение библиотек'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1314234690215820996</id><published>2010-11-26T04:13:00.010+03:00</published><updated>2011-08-16T11:48:50.071+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>Hex-константы и хедеры</title><content type='html'>Не могу решить какую запись hex-констант на DEmbro выбрать в качестве основной. (Основной, потому что в языке будeт возможность для реализации любого способа.)&lt;br /&gt;&lt;br /&gt;Во-первых, что лучше — обозначать hex-константу префиксом или постфиксом? Мне привычней префикс, но это лишь вопрос привычки, зато парсинг немного проще.&lt;br /&gt;&lt;br /&gt;Логичней всего использовать букву h (принято в asm'ах, но у них это не префикс, а постфикс):&lt;br /&gt;hFFF1&lt;br /&gt;&lt;br /&gt;Однако, есть опасения, что это ненаглядно, и может с непривычки сливаться с другими буквами hex-константы, особенно если писать их в одинаковом регистре.&lt;br /&gt;&lt;br /&gt;С++ стиль (префиксные символы &lt;b&gt;0x &lt;/b&gt;перед цифрами)&lt;br /&gt;0xFFF1&lt;br /&gt;неудачен тем, что на него требуется два символа, а хочется задействовать только один.&lt;br /&gt;&lt;br /&gt;А Delphi-стиль (префикс &lt;b&gt;$&lt;/b&gt; перед цифрами)&lt;br /&gt;$FFF1&lt;br /&gt;хоть и не очень распространён и не логичен, выглядит наиболее удобным — особый символ, не сливающийся с цифрами.&lt;br /&gt;&lt;br /&gt;Пока что я избрал первый вариант, посмотрим приживётся или нет. &lt;br /&gt;&lt;br /&gt;Пишу тут заголовок для WinApi &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/units/windows.de"&gt;windows.de&lt;/a&gt; на DEmbro. Из-за многих недоработок языка выглядит непричёсанным, но всё по-взрослому: с переобозначением типов, объявлением констант, объявлением прототипов функций с автоматической их загрузкой в период выполнения (т.е. не при подключении библиотеки, а при вызове функции windows-load этой библиотеки). Когда требуется добавить новую функцию в хедер, достаточно прописать её прототип один раз, не нужно копипастить что-то в стиле&lt;br /&gt;typedef ... (*SomeFunc_t)(....);&lt;br /&gt;...&lt;br /&gt;extern SomeFunc_t SomeFunc;&lt;br /&gt;...&lt;br /&gt;SomeFunc = (SomeFunc_t)GetProcAddress(libuser32, "SomeFunc");&lt;br /&gt;&lt;br /&gt;Одна моя мечта сбылась *.* Йииехуууууу!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1314234690215820996?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1314234690215820996/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/11/hex.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1314234690215820996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1314234690215820996'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/11/hex.html' title='Hex-константы и хедеры'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-7308558656970978882</id><published>2010-11-23T23:02:00.003+03:00</published><updated>2010-12-18T03:00:19.763+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Разные файлы — разные настройки</title><content type='html'>По мере того, как я плотнее программирую на нескольких языках, всё больше становится необходимо задавать под разные типы файлов совершенно разные настройки. Например, &lt;a href="http://keyfighter.blogspot.com/2009/02/folding.html"&gt;сворачивание текста (folding)&lt;/a&gt; в исходниках для Free Pascal я оформляю конструкцией REGION (для совместимости с IDE Delphi), а в DEmbro обычным вимовским образом.&lt;br /&gt;&lt;br /&gt;Штатный вариант это сделать: поправить файлы filetype-настроек (синтаксиса, компилятора или другие подобные) — но почему-то не хочется в них разбираться, хочется всё просто описать в «.vimrc».&lt;br /&gt;&lt;br /&gt;А в «.vimrc» это сделать так просто нельзя: опция filetype будет вычислена уже после выполнения «.vimrc», т.е. в «.vimrc» будет не доступна. А нам нужно внутри «.vimrc» сделать в случае одного filetype одни настройки, а в случае другого filetype — другие.&lt;br /&gt;&lt;br /&gt;Один из трюков заключается в следующем: описываем настройки в виде функции:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;DEmbroMarker&lt;font color="#00af87"&gt;()&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;fdm&lt;/font&gt;=marker&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;commentstring&lt;/font&gt;=//%s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;foldmarker&lt;/font&gt;={{{&lt;font color="#0087af"&gt;,&lt;/font&gt;}}}&lt;br /&gt;&lt;font color="#0087af"&gt;endfunction&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;А потом, в самом конце, прописываем условное действие при запуске всех файлов:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;au&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;BufRead&lt;/font&gt;,&lt;font color="#87af87"&gt;BufNewFile&lt;/font&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;&amp;amp;ft&amp;nbsp;&lt;font color="#0087af"&gt;==&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;'dembro'&lt;/font&gt;&amp;nbsp;|&amp;nbsp;&lt;font color="#0087af"&gt;call&lt;/font&gt;&amp;nbsp;&lt;span style="background-color: #000000"&gt;&lt;font color="#a8a8a8"&gt;DEmbroMarker&lt;/font&gt;&lt;/span&gt;&lt;font color="#00af87"&gt;()&lt;/font&gt;&amp;nbsp;|&amp;nbsp;&lt;font color="#0087af"&gt;endif&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Аналогично для другого типа файла (в моём случае, для pascal'я).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-7308558656970978882?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/7308558656970978882/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7308558656970978882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/7308558656970978882'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/11/blog-post.html' title='Разные файлы — разные настройки'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3092550092773371164</id><published>2010-11-23T03:52:00.002+03:00</published><updated>2010-11-23T03:54:28.620+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>MessageBox</title><content type='html'>Только что &lt;a href="http://code.google.com/p/dforth/source/browse/trunk/release/examples/MessageBox.de"&gt;моя прога на DEmbro&lt;/a&gt; смогла вывести на экран виндовый message box. Доволен как слон.&lt;br /&gt;&lt;br /&gt;В целом, темпы очень маленькие, много ленюсь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3092550092773371164?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3092550092773371164/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/11/messagebox.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3092550092773371164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3092550092773371164'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/11/messagebox.html' title='MessageBox'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-661827062518404549</id><published>2010-11-15T11:26:00.007+03:00</published><updated>2010-11-15T21:20:36.431+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='концепция'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>Name typization</title><content type='html'>Ночью, когда спал, придумал механизм типизированных имён.&lt;br /&gt;&lt;br /&gt;Динамическая типизация — это когда переменная может принимать значение любого &lt;br /&gt;типа. Как только с переменной нужно проделать какое-то действие (сложение, например),&lt;br /&gt;интерпретатор узнаёт тип переменной, и в зависимости от этого выбирает операцию. &lt;br /&gt;Это очень удобно, не нужно заботиться о явном указании типа. Но работает медленней.&lt;br /&gt;&lt;br /&gt;Статическая типизация — это когда у каждой переменной заранее указывается тип, &lt;br /&gt;и к моменту выполнения операции (сложения, например) понятно что нужно делать.&lt;br /&gt;Но указывать типы переменных нужно везде. Это не очень удобно, и мне всегда &lt;br /&gt;этим не нравилась статическая типизация.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[Upd]&lt;/b&gt; Всё, что идёт ниже, про упрощение статической типизации.&lt;br /&gt;&lt;br /&gt;Я осознал, что бывают такие переменные, у которых всегда один и тот же тип.&lt;br /&gt;Например, у меня переменные I и J всегда имеют тип Integer, переменные&lt;br /&gt;Name и FileName тип TString, P тип Pointer и т.д. Было бы весьма удобно иметь&lt;br /&gt;возможность указать привязанные к именам типы, чтобы потом их явно не &lt;br /&gt;указывать. Как-то так:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;typization&lt;/font&gt;&amp;nbsp;I, J, N, M, K: &lt;font color="#87af87"&gt;Integer&lt;/font&gt;;&lt;br /&gt;&lt;font color="#0087af"&gt;typization&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;Name&lt;/font&gt;, FileName, Dir: TString;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;LoadFilesInDir(Dir);&lt;br /&gt;&lt;font color="#0087af"&gt;var&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Files: TArrayOfString;&lt;br /&gt;&amp;nbsp;&amp;nbsp;I;&lt;br /&gt;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;GetFilesInDir(Dir, Files);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;for&lt;/font&gt;&amp;nbsp;I := &lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;to&lt;/font&gt;&amp;nbsp;&lt;font color="#00afaf"&gt;High&lt;/font&gt;(Files) &lt;font color="#0087af"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadFile(Files[I]);&lt;br /&gt;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;При этом если нужно, то у переменных с такими названиями можно вручную указать&lt;br /&gt;другой тип.&lt;br /&gt;&lt;br /&gt;К примеру, в математическом модуле, все переменные с именами M, H, Mat, Matrix будут&lt;br /&gt;являться матрицами, V, A, B, Vec, Vector — векторами, Q, R, Quat и Quaternion — &lt;br /&gt;кватернионами и т.д. Вот было бы хорошо, если бы можно было делать так&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;typization&lt;/font&gt;&amp;nbsp;M, H, Mat, Matrix: TMat4f;&lt;br /&gt;&lt;font color="#0087af"&gt;typization&lt;/font&gt;&amp;nbsp;V, A, B, Vec, Vector: TVec3f;&lt;br /&gt;&lt;font color="#0087af"&gt;typization&lt;/font&gt;&amp;nbsp;Q, R, Quat, Quaternion: TQuat;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Add3f(A, B): TVec3f;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Dot3f(A, B): TVec3f;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Cross3f(A, B): TVec3f;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Len3f(V): &lt;font color="#87af87"&gt;Single&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Apply3f(M, V): TVec3f; &lt;font color="#87af87"&gt;overload&lt;/font&gt;;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;Apply3f(Q, V): TVec3f; &lt;font color="#87af87"&gt;overload&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Возможно, что иногда даже можно бы было не объявлять переменную, компилятор сам&lt;br /&gt;бы создал локальную с таким именем. Например, если в функции используется &lt;br /&gt;переменная I, то скорее всего она локальная и имеет тип Integer (потому что этот &lt;br /&gt;тип указан в typization секции).&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;procedure&lt;/font&gt;&amp;nbsp;LoadFilesInDir(Dir);&lt;br /&gt;&lt;font color="#0087af"&gt;var&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Files: TArrayOfString;&lt;br /&gt;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;GetFilesInDir(Dir, Files)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;for&lt;/font&gt;&amp;nbsp;I := &lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;to&lt;/font&gt;&amp;nbsp;&lt;font color="#00afaf"&gt;High&lt;/font&gt;(Files) &lt;font color="#0087af"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadFile(Files[I]);&lt;br /&gt;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-661827062518404549?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/661827062518404549/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/11/name-typization.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/661827062518404549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/661827062518404549'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/11/name-typization.html' title='Name typization'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2402378559783973651</id><published>2010-10-19T18:59:00.001+04:00</published><updated>2010-10-19T19:00:36.452+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><category scheme='http://www.blogger.com/atom/ns#' term='dembro'/><title type='text'>DForth → DEmbro</title><content type='html'>Почти два месяца ничего не делал с фортом, так как был занят другими делами. Теперь снова возобновляю процесс.&lt;br /&gt;&lt;br /&gt;Во-первых, я решил переименовать язык с DForth в DEmbro, в связи с тем, что слишком уж много расхождений с обычным фортом.&lt;br /&gt;&lt;br /&gt;Во-вторых, открыл отдельный &lt;a href="http://code.google.com/p/dforth/wiki/DEmbro"&gt;wiki- и svn-сервер под проект&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В-третьих, на днях один мой знакомый изъявил желание помочь с оптимизациями.&lt;br /&gt;&lt;br /&gt;Сейчас ведётся активная разработка подключения динамических библиотек (dll в windows'е).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2402378559783973651?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2402378559783973651/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/10/dforth-dembro.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2402378559783973651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2402378559783973651'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/10/dforth-dembro.html' title='DForth → DEmbro'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-4731603711268714514</id><published>2010-08-30T04:27:00.002+04:00</published><updated>2010-08-31T10:57:17.354+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>Автоматизация в обычной жизни: исправление субтитров</title><content type='html'>В одном из фильмов не загружались субтитры. Решил посмотреть что не так, файл с субтитрами выглядел так&lt;br /&gt;&lt;br /&gt;00:01:40.12,00:01:41.34&lt;br /&gt;Dear God&lt;br /&gt;&lt;br /&gt;00:01:41.44,00:01:44.15&lt;br /&gt;Cut it off! His arm - cut it off!&lt;br /&gt;&lt;br /&gt;00:01:58.92,00:02:00.23&lt;br /&gt;Is he dead?&lt;br /&gt;&lt;br /&gt;00:02:00.32,00:02:03.07&lt;br /&gt;- Are you drunk, Mr Price?[br]- I am, I am.&lt;br /&gt;&lt;br /&gt;00:02:03.16,00:02:06.35&lt;br /&gt;- Is he dead, the Colonel?[br]- Not dead yet. He has hope.&lt;br /&gt;&lt;br /&gt;00:02:06.44,00:02:09.43&lt;br /&gt;Hey! You two. Get him back. Back!&lt;br /&gt;&lt;br /&gt;00:02:11.32,00:02:14.91&lt;br /&gt;We're in! Do you hear? They cheer!&lt;br /&gt;&lt;br /&gt;00:02:15.00,00:02:16.95&lt;br /&gt;Cuidad Rodrigo is taken&lt;br /&gt;&lt;br /&gt;00:02:17.04,00:02:19.63&lt;br /&gt;Oh. He looks dead to me.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;А чтобы субтитры прочитались в моём плеере (GOMPlayer), он должен был выглядеть так:&lt;br /&gt;&lt;br /&gt;0&lt;br /&gt;00:01:40.12 --&amp;gt; 00:01:41.34&lt;br /&gt;Dear God&lt;br /&gt;&lt;br /&gt;1&lt;br /&gt;00:01:41.44 --&amp;gt; 00:01:44.15&lt;br /&gt;Cut it off! His arm - cut it off!&lt;br /&gt;&lt;br /&gt;2&lt;br /&gt;00:01:58.92 --&amp;gt; 00:02:00.23&lt;br /&gt;Is he dead?&lt;br /&gt;&lt;br /&gt;3&lt;br /&gt;00:02:00.32 --&amp;gt; 00:02:03.07&lt;br /&gt;- Are you drunk, Mr Price?[br]- I am, I am.&lt;br /&gt;&lt;br /&gt;4&lt;br /&gt;00:02:03.16 --&amp;gt; 00:02:06.35&lt;br /&gt;- Is he dead, the Colonel?[br]- Not dead yet. He has hope.&lt;br /&gt;&lt;br /&gt;5&lt;br /&gt;00:02:06.44 --&amp;gt; 00:02:09.43&lt;br /&gt;Hey! You two. Get him back. Back!&lt;br /&gt;&lt;br /&gt;6&lt;br /&gt;00:02:11.32 --&amp;gt; 00:02:14.91&lt;br /&gt;We're in! Do you hear? They cheer!&lt;br /&gt;&lt;br /&gt;7&lt;br /&gt;00:02:15.00 --&amp;gt; 00:02:16.95&lt;br /&gt;Cuidad Rodrigo is taken&lt;br /&gt;&lt;br /&gt;8&lt;br /&gt;00:02:17.04 --&amp;gt; 00:02:19.63&lt;br /&gt;Oh. He looks dead to me.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Т.е. нужно добавить нумерацию и заменить запятые на стрелочки. Строк в файле 3438, вручную его править нет никакого желания. Поэтому я решил автоматизировать этот процесс.&lt;br /&gt;&lt;br /&gt;Чтобы заменить запятые на стрелочки, можно воспользоваться макросами в виме. В первой строке выполняем &lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;qw0f,&lt;font color="#0087af"&gt;cl&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;--&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#00af87"&gt;ESC&lt;/font&gt;&lt;font color="#00af87"&gt;&amp;gt;&lt;/font&gt;jjjq&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;Это создаст макрос на букве w, меняющий в текущей строке первую запятую на стрелочку и смещающий курсор на три строки вниз. Осталось теперь несколько раз набрать &lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;&lt;font color="#87afaf"&gt;1000&lt;/font&gt;&lt;font color="#00af87"&gt;@w&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;и все запятые будут заменены на стрелочки.&lt;br /&gt;&lt;br /&gt;Теперь перейдём к нумерации. Тут мы воспользуемся M4, а именно пригодится макрос incr, который предназначен для увеличения своего параметра на единицу. Например, incr(`17') выдаст 18.&lt;br /&gt;&lt;br /&gt;Будем хранить в переменной count кол-во занумерованных строк:&lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`count'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`0'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;а макрос current будет подставлять очередной номер субтитра и увеличивать count на 1:&lt;br /&gt;&lt;span style="background-color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`current'&lt;/font&gt;,&lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`count'&lt;/font&gt;,&lt;font color="#0087af"&gt;incr(&lt;/font&gt;count&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;font color="#87afaf"&gt;count'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;Эти два определения нужно расположить в самом начале файла.&lt;br /&gt;&lt;br /&gt;Теперь вставляем current перед описанием каждого субтитра — используем тот же приём, что и при замене запятых, только создание макроса будет выглядеть так (предполагается, что курсор находится на пустой строке):&lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;qwocurrent&lt;font color="#00af87"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#00af87"&gt;ESC&lt;/font&gt;&lt;font color="#00af87"&gt;&amp;gt;&lt;/font&gt;jjjq&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Осталось скормить это в m4:&lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;m4 subtitles.srt4 &amp;gt; subtitles.srt&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Всё, теперь субтитры грузятся и работают.&lt;br /&gt;&lt;br /&gt;Осталась совсем маленькая деталь — в субтитрах можно обнаружить команду [br]. Она предназначена для разбиения субтитров на несколько строк, однако, GOMPlayer это игнорирует и отображает её как текст. Чтобы заменить все вхождения [br] на разбиение строк, достаточно выполнить команду&lt;br /&gt;&lt;span style="background-color: #000000; color: #a8a8a8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="monospace"&gt;:&lt;font color="#87afaf"&gt;%&lt;/font&gt;&lt;font color="#0087af"&gt;s&lt;/font&gt;&lt;font color="#00af87"&gt;/&lt;/font&gt;\[br\]&lt;font color="#00af87"&gt;/&lt;/font&gt;\r&lt;font color="#00af87"&gt;/&lt;/font&gt;&lt;font color="#00af87"&gt;g&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-4731603711268714514?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/4731603711268714514/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/blog-post_29.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4731603711268714514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4731603711268714514'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/blog-post_29.html' title='Автоматизация в обычной жизни: исправление субтитров'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3961213190159609111</id><published>2010-08-28T05:43:00.000+04:00</published><updated>2010-08-28T05:48:35.627+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><title type='text'>DForth: продвижения 3</title><content type='html'>Устроил полный рефакторинг. Почти готова возможность подключения внешних библиотек.&lt;br /&gt;&lt;br /&gt;Сразу после запуска доступно 525 команд — вышло много комбинаторных взрывов с типизированными командами. В этом деле M4 очень помогает избежать копипаста.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3961213190159609111?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3961213190159609111/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/forth-3.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3961213190159609111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3961213190159609111'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/forth-3.html' title='DForth: продвижения 3'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8580461495973364174</id><published>2010-08-16T18:00:00.000+04:00</published><updated>2010-08-16T18:02:32.214+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><title type='text'>DForth: продвижения 2</title><content type='html'>Появились функции (т.е. объявление своих команд через двоеточие, в том числе immediate), работа с двумя видами строк.&lt;br /&gt;&lt;br /&gt;Уже продумал как будет оформляться вызов функций из внешних динамических библиотек.&lt;br /&gt;&lt;br /&gt;Читаю потихоньку стандарт &lt;a href="http://fforum.winglion.ru/att/dpans94/dpans94ru1251.txt"&gt;forth-94&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8580461495973364174?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8580461495973364174/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8580461495973364174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8580461495973364174'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth-2.html' title='DForth: продвижения 2'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-3604718064783859171</id><published>2010-08-08T21:23:00.000+04:00</published><updated>2010-08-20T20:15:00.271+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><title type='text'>DForth: продвижения</title><content type='html'>Написал генерацию шитого кода, его исполнение (первоначально была написана чистая интерпретация). Написал команды branch, ?branch, &gt;mark и &gt;resolve, позволяющие реализовывать условные и безусловные переходы. Когда добавлю возможность объявлять свои команды (т.е. функции) — средств будет достаточно, чтобы на самом DForth'е реализовать оператор if.&lt;br /&gt;&lt;br /&gt;Научился создавать пустой исполняемый файл (который ничего не делает) для Win32. Убил на это три дня :)&lt;br /&gt;&lt;br /&gt;Прочитал стандарт &lt;a href="http://forth.sourceforge.net/standard/fst83/"&gt;forth-83&lt;/a&gt;. Весьма примитивно, я ожидал чего-то бо́льшего. Но всё равно интересно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-3604718064783859171?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/3604718064783859171/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth_08.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3604718064783859171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/3604718064783859171'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth_08.html' title='DForth: продвижения'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6238366973640445565</id><published>2010-08-05T19:14:00.001+04:00</published><updated>2010-08-05T19:34:29.668+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>Азы M4</title><content type='html'>Всё описанное должно работать в GNU версии макропрепроцессора m4, в операционной системе Windows XP.&lt;br /&gt;&lt;br /&gt;Скачать можно &lt;a href="http://gnuwin32.sourceforge.net/packages/m4.htm"&gt;отсюда&lt;/a&gt;, в первую очередь требуются Binaries и Dependencies. После размещения m4.exe и regex2.dll в одну папку можно начать пользоваться.&lt;br /&gt;&lt;br /&gt;Запуск m4.exe без параметров вызывает прогу в REPL-режиме. Чтобы выйти из m4, нужно набрать m4exit. В этом REPL режиме удобно отлаживать свои наработки.&lt;br /&gt;&lt;br /&gt;Чтобы обработать файл, достаточно передать его имя в качестве параметра:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 u1.pas4&lt;br /&gt;&lt;br /&gt;При этом m4 выдаст результат в стандартный вывод. Стандартный вывод можно перенаправить в файл:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 u1.pas4 &gt; u1.pas&lt;br /&gt;&lt;br /&gt;Если передать несколько файлов, то они будут последовательно выполнены так, как будто это единый файл.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 u1.pas4 u2.pas4 &gt; u.pas&lt;br /&gt;&lt;br /&gt;Это было то, что касается запуска m4, теперь приступим к собственно использованию. m4 ищет в поступающем тексте макросы и исполняет их. Например, макрос __file__ заменяется на название текущего файла, а __line__ на номер текущей строки.&lt;br /&gt;&lt;br /&gt;В m4 есть такое понятие, как цитата, по умолчанию цитаты должны быть заключены в кавычки (обратите внимание, что они разные)&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;`это цитата'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;К примеру, если у вас в тексте встречается __file__, которое не должно быть заменено на имя файла, то его нужно оформить в виде цитаты&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;`&lt;font color="#87afaf"&gt;__file__&lt;/font&gt;'&lt;/font&gt;&lt;br /&gt;m4 при этом отбросит кавычки и останется только __file__.&lt;br /&gt;&lt;br /&gt;При помощи макроса changequote можно сменить символы, отвечающие за кавычки:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;changequote(&lt;/font&gt;{,}&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;После этого цитаты можно оформлять в виде:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;{&lt;font color="#87afaf"&gt;__file__&lt;/font&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Замена стандартных ограничителей цитат полезна при написании программ на паскале, ­ в котором строковые выражения заворачиваются в одинарные кавычки, что может сбить с толку m4.&lt;br /&gt;&lt;br /&gt;Вернём стандартные цитатные символы&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;changequote(&lt;/font&gt;&lt;font color="#87afaf"&gt;`,'&lt;/font&gt;&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Собственные макросы объявляются при помощи макроса define. Первый переданный ему параметр задаёт имя макроса, а второй тело.&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`foo'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`bar'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Макрос foo будет просто заменяться на bar. $1, $2, $3 и т.д. в теле макроса заменяются на переданные параметры. Например:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;&lt;font color="#87afaf"&gt;`assign'&lt;/font&gt;, &lt;font color="#87afaf"&gt;`&lt;/font&gt;&lt;font color="#00af87"&gt;$2&lt;/font&gt;&lt;font color="#87afaf"&gt;&amp;nbsp;:= &lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#87afaf"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;assign(a+b, c)&lt;/font&gt;&lt;br /&gt;выведет «c := a+b»&lt;br /&gt;&lt;br /&gt;Изученного уже достаточно чтобы написать макрос assert для проверки истинности утверждения:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;changequote(&lt;/font&gt;~,&amp;quot;&lt;font color="#0087af"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;define(&lt;/font&gt;~assert&amp;quot;, ~if not &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#00af87"&gt;$1&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;then begin Writeln&lt;font color="#00af87"&gt;(&lt;/font&gt;'Assert error &lt;font color="#00af87"&gt;$1&lt;/font&gt;&amp;nbsp;in &lt;font color="#87afaf"&gt;__file__&lt;/font&gt;:&lt;font color="#87afaf"&gt;__line__&lt;/font&gt;'&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;end&amp;quot;&lt;font color="#00afaf"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Пример использования:&lt;br /&gt;&lt;font face="monospace"&gt;&amp;nbsp;&amp;nbsp;assert(Obj &amp;lt;&amp;gt; nil);&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6238366973640445565?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6238366973640445565/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/m4.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6238366973640445565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6238366973640445565'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/m4.html' title='Азы M4'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-8141041139397474659</id><published>2010-08-04T23:21:00.001+04:00</published><updated>2010-08-04T23:34:15.551+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='M4'/><title type='text'>M4</title><content type='html'>Я вот пишу свою прогу для препроцессинга сурсов (&lt;a href="http://keyfighter.blogspot.com/search/label/dpp"&gt;dpp&lt;/a&gt;), а тут вдруг обнаружил программку M4:&lt;br /&gt;&lt;a href="http://lib.custis.ru/M4"&gt;http://lib.custis.ru/M4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Она предназначена для препроцессинга исходников на основе макросов. Т.е. именно то, чего мне так не хватает. Круто! Теперь буду её изучать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-8141041139397474659?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/8141041139397474659/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8141041139397474659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/8141041139397474659'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/blog-post.html' title='M4'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-4024921241597321082</id><published>2010-08-03T21:39:00.000+04:00</published><updated>2010-08-03T21:41:41.610+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forth'/><title type='text'>DForth</title><content type='html'>Недавно начал читать про язык Forth, мне понравились некоторые идеи, но как-то влом его досконально изучать. Поэтому я решил реализовать свой форт, под названием DForth. Пишу его на языке free pascal.&lt;br /&gt;&lt;br /&gt;За сегодня написал основные команды работы со стеком для всех видов целых чисел, арифметические операции для них же, вывод их в консоль, функции сравнения и булевы операции. Это всё вылилось в 210 команд! Не хило так... И это я ещё не приступил ни к чему содержательному, совсем.&lt;br /&gt;&lt;br /&gt;Написал REPL режим (интерактивный в консоли) и динамическую библиотеку для использования DForth в качестве скриптового движка.&lt;br /&gt;&lt;br /&gt;Начал изучать как создаются exe-файлы в win32, благо это есть в исходниках fpc :) Поэтому скоро мой DForth станет одновременно компилятором, интерпретатором и скриптовым движком.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-4024921241597321082?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/4024921241597321082/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4024921241597321082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/4024921241597321082'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/08/dforth.html' title='DForth'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2457417125307557332</id><published>2010-07-31T16:16:00.001+04:00</published><updated>2010-08-05T03:32:09.839+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='free pascal vs lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='fpc'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>Обработка ошибок внешних библиотек</title><content type='html'>Возможно, что вам приходилось когда-нибудь писать код создания окна на чистом WinApi. Наверно, он выглядел примерно так:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;function&lt;/font&gt;&amp;nbsp;CreateWindow(Width, Height : &lt;font color="#87af87"&gt;Integer&lt;/font&gt;; Fullscreen : &lt;font color="#87af87"&gt;Boolean&lt;/font&gt;; PixelDepth : &lt;font color="#87af87"&gt;Integer&lt;/font&gt;) : &lt;font color="#87af87"&gt;Boolean&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// ...&lt;/font&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// ...&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;(RegisterClass(wndClass) = &lt;font color="#87afaf"&gt;0&lt;/font&gt;) &lt;font color="#0087af"&gt;then&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Attemp to register the window class&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Failed to register the window class!'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// ...&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;h_Wnd := CreateWindowEx(dwExStyle,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Extended window styles&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;'OpenGL'&lt;/font&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8787af"&gt;// Class name&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WND_TITLE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Window title (caption)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwStyle,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Window styles&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;0&lt;/font&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8787af"&gt;// Window position&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Width, Height,&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Size of window&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// No parent window&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// No menu&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h_Instance,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8787af"&gt;// Instance&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;nil&lt;/font&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8787af"&gt;// Pass nothing to WM_CREATE&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;h_Wnd = &lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to create window!'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Try to get a device context&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;h_DC := GetDC(h_Wnd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;(h_DC = &lt;font color="#87afaf"&gt;0&lt;/font&gt;) &lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to get a device context!'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// ...&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;PixelFormat := ChoosePixelFormat(h_DC, @pfd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;(PixelFormat = &lt;font color="#87afaf"&gt;0&lt;/font&gt;) &lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to find a suitable pixel format'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;(&lt;font color="#0087af"&gt;not&lt;/font&gt;&amp;nbsp;SetPixelFormat(h_DC, PixelFormat, @pfd)) &lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to set the pixel format'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// Create a OpenGL rendering context&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;h_RC := wglCreateContext(h_DC);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;(h_RC = &lt;font color="#87afaf"&gt;0&lt;/font&gt;) &lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to create an OpenGL rendering context'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;not&lt;/font&gt;&amp;nbsp;wglMakeCurrent(h_DC, h_RC) &lt;font color="#0087af"&gt;then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Unable to activate OpenGL rendering context'&lt;/font&gt;, &lt;font color="#87afaf"&gt;'Error'&lt;/font&gt;, MB_OK &lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_ICONERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00afaf"&gt;Exit&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8787af"&gt;// ...&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;Result&lt;/font&gt;&amp;nbsp;:= &lt;font color="#87afaf"&gt;True&lt;/font&gt;;&lt;br /&gt;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Можно заметить, что тут очень много копипастится код&lt;br /&gt;&lt;br /&gt;    MessageBox(0, 'Unable to «что не получилось»!', 'Error', MB_OK or MB_ICONERROR);&lt;br /&gt;    Exit;&lt;br /&gt;&lt;br /&gt;Кроме копипаста этих двух строк, есть и второй копипаст: вместо «что не получилось» нужно везде прописывать название функции, в которой это не получилось. Как это можно бы было улучшить? Вынести в отдельную функцию нельзя, потому что Exit не умеет прыгать сразу на две функции вверх, а чтобы message box отобразил строку, нужно эту строку вбить вручную (не важно где, главное что эта строка должна быть вбита своими руками).&lt;br /&gt;&lt;br /&gt;Конечно, в языке есть исключения, но WinApi не бросает никаких исключений специально для Free Pascal в случае штатных ошибок. &lt;br /&gt;&lt;br /&gt;Как же быть? А никак — только копипаст. Те же беды с контролем ошибок в WinSock, DirectX и далее по списку.&lt;br /&gt;&lt;br /&gt;Как такое обойти на лиспе? Понятно, что в данном случае нужно писать макрос, который принимает последовательность команд и генерирует из них код, который последовательно их выполняет, проверяя возвращаемые значения, и в случае нулевого результата, выдаёт мессадж-бокс с последующим возвращением NIL.&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;block-check-winapi&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;body&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;block&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;f&amp;nbsp;in&amp;nbsp;body&amp;nbsp;collect&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;eql&lt;/font&gt;&amp;nbsp;,f&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;progn&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;MessageBox&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;format&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Unable to ~a&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;,f&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#87afaf"&gt;&amp;quot;Error&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;or&lt;/font&gt;&amp;nbsp;MB_OK&amp;nbsp;MB_ICONERROR&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;T&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Как всегда, для наглядности привожу пример того, во что эта конструкция разворачивается:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;block-check-winapi&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;RegisterClass&amp;nbsp;wndClass&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;CreateWindowEx&amp;nbsp;dwExStyle&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;OpenGL&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WND_TITLE&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwStyle&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Width&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Height&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h_Instance&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;BLOCK&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;IF&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;EQL&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;REGISTERCLASS&amp;nbsp;WNDCLASS&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;PROGN&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;MESSAGEBOX&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;FORMAT&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Unable to ~a&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;REGISTERCLASS WNDCLASS&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Error&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;OR&lt;/font&gt;&amp;nbsp;MB_OK&amp;nbsp;MB_ICONERROR&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;RETURN&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;IF&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;EQL&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;CREATEWINDOWEX&amp;nbsp;DWEXSTYLE&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;OpenGL&amp;quot;&lt;/font&gt;&amp;nbsp;WND_TITLE&amp;nbsp;DWSTYLE&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;WIDTH&amp;nbsp;HEIGHT&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;H_INSTANCE&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;PROGN&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;MESSAGEBOX&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;FORMAT&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Unable to ~a&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;CREATEWINDOWEX DWEXSTYLE &lt;font color="#87afaf"&gt;&amp;quot;OpenGL&amp;quot;&lt;/font&gt;&amp;nbsp;WND_TITLE DWSTYLE 0 0 WIDTH&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HEIGHT 0 0 H_INSTANCE &lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Error&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;OR&lt;/font&gt;&amp;nbsp;MB_OK&amp;nbsp;MB_ICONERROR&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;RETURN&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;NIL&lt;/font&gt;&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;T&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-2457417125307557332?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/2457417125307557332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/07/blog-post_31.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2457417125307557332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/2457417125307557332'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/07/blog-post_31.html' title='Обработка ошибок внешних библиотек'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-6743236053845982033</id><published>2010-07-28T19:06:00.000+04:00</published><updated>2010-08-12T01:19:42.060+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='free pascal vs lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='fpc'/><category scheme='http://www.blogger.com/atom/ns#' term='dpp'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>Загрузка, ждите</title><content type='html'>С давних времён я задаюсь вопросом о том как можно бы было сделать рисование полосы загрузки по мере выполнения какого-то большого кода — например, при загрузке операционной системы, при запуске всяких программ и игр.&lt;br /&gt;&lt;br /&gt;В случае с установщиком все понятно — установщику нужно скопировать определенный набор файлов, делаем это в цикле, а в самом конце каждой итерации обновляем полосу загрузки.&lt;br /&gt;&lt;br /&gt;Но что делать, если в программе нужно выполнить кучу неоднородного кода (который нельзя так просто оформить в виде цикла), заставляющего пользователя ждать? Пример с запуском операционной системы очень хороший.&lt;br /&gt;&lt;br /&gt;На Free Pascal я могу назвать три решения.&lt;br /&gt;1) В лоб — после каждой строчки кода загрузки вызываем функцию перерисовки. Это можно сделать так:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;for&lt;/font&gt;&amp;nbsp;I := &lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;to&lt;/font&gt;&amp;nbsp;LinesCount - &lt;font color="#87afaf"&gt;1&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;do&lt;/font&gt;&amp;nbsp;&lt;font color="#0087af"&gt;begin&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;case&lt;/font&gt;&amp;nbsp;I &lt;font color="#0087af"&gt;of&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;: &amp;lt;Line0&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;: &amp;lt;Line1&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;: &amp;lt;Line2&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;RedrawLoading(I, LinesCount);&lt;br /&gt;&lt;font color="#0087af"&gt;end&lt;/font&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Вполне приемлемое решение, кроме того, что при добавлении новой строки нужно не забыть увеличить LinesCount.&lt;br /&gt;&lt;br /&gt;2) Использовать нити (threads, так же известные как «потоки») — в одной нити грузим, в другой обновляем экран. Решение мне не нравится тем, что ИМХО с нитями лучше лишний раз не связываться.&lt;br /&gt;&lt;br /&gt;3) Написать класс, предназначенный для выполнения одного шага загрузки, имеющий одну абстрактную виртуальную функцию Execute(). Унаследовать от него разные типы шагов: копирование файла, загрузка библиотеки, загрузки картинки, проверка чего-нибудь и т.д. После этого перед загрузкой занести в нужной последовательности такие классы в массив, и в цикле после каждого Execute вызывать RedrawLoading(I, Length(Steps)). Очень громоздкое решение — городить его ради ерунды как-то не очень хочется.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Наиболее симпатичным является первое решение, за свою простоту. Но вручную это делать не хочется — вот было бы здорово, если бы компилятор это сделал сам! &lt;br /&gt;&lt;br /&gt;На лиспе в таких случаях проблем нет — просто пишется макрос, который всю грязную работу выполняет за вас. У меня для данной задачи получилось следующее&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;watch&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;watch-func&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;&amp;amp;body&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;op&amp;nbsp;body&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;progn&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;upto&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;list-length&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;collect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;evenp&lt;/font&gt;&amp;nbsp;i&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8700d7"&gt;`(&lt;/font&gt;,watch-func&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;/&lt;/font&gt;&amp;nbsp;i&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;list-length&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;result&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;car&lt;/font&gt;&amp;nbsp;op&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;setf&lt;/font&gt;&amp;nbsp;op&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;cdr&lt;/font&gt;&amp;nbsp;op&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;result&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;,watch-func&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;list-length&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;list-length&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Функция watch-func как бы наблюдает за ходом выполнения кода body, поэтому макрос я назвал watch. Несмотря на то, что я попытался написать красивый код, получилось спагетти. Но поставленную задачу оно выполняет, вот лог нескольких тестов:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;watch&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;A&amp;nbsp;B&amp;nbsp;C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;F&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;PROGN&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;A&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;B&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;C&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;3&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;D&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;4&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;E&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;5&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;F&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;6&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;watch&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;A&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;PROGN&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;A&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;watch&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;PROGN&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;L&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;По хорошему, нужно еще обезопасить L от многократных вычислений, это можно сделать конструкцией once-only.&lt;br /&gt;&lt;br /&gt;В Free Pascal нормальной системы макросов нет. Поэтому аналогичную конструкцию я написал в моей утилитке dpp. Т.к. для того, чтобы достаточно точно интегрировать конструкцию в сам язык, нужно парсить программу на паскале, мне пришлось вводить несколько инородный синтаксис:&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#(watch (RenderLoading)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FGui := TGui.Create(FGraph, FWindow);)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FFontMan := TFontMan.Create(Graph);)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FScene := TCucuScene.Create(Graph);)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FStyle := TStyle.Create;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FStyle.SetParam(&lt;font color="#87afaf"&gt;'font.primary'&lt;/font&gt;, TStyleParamFont.Create(TFont.Create(FFontMan, &lt;font color="#87afaf"&gt;'data\font\c256.bit'&lt;/font&gt;, &lt;font color="#87afaf"&gt;-6&lt;/font&gt;)));)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FStyle.SetParam(&lt;font color="#87afaf"&gt;'color.primary'&lt;/font&gt;, TStyleParamColor.Create(Vec4f(&lt;font color="#87afaf"&gt;0.5&lt;/font&gt;, &lt;font color="#87afaf"&gt;0.5&lt;/font&gt;, &lt;font color="#87afaf"&gt;0&lt;/font&gt;, &lt;font color="#87afaf"&gt;1&lt;/font&gt;)));)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FStyle.SetParam(&lt;font color="#87afaf"&gt;'color.background'&lt;/font&gt;, TStyleParamColor.Create(Vec4f(&lt;font color="#87afaf"&gt;0.3&lt;/font&gt;, &lt;font color="#87afaf"&gt;0.0&lt;/font&gt;, &lt;font color="#87afaf"&gt;0.3&lt;/font&gt;, &lt;font color="#87afaf"&gt;1&lt;/font&gt;)));)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FGui.Root.Style := FStyle;)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FConsole := TGuiConsole.Create(FGui);)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(FStart := GetTimer;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;)&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-6743236053845982033?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/6743236053845982033/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/07/blog-post_28.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6743236053845982033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/6743236053845982033'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/07/blog-post_28.html' title='Загрузка, ждите'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1902140542606499431</id><published>2010-07-24T11:29:00.000+04:00</published><updated>2010-07-24T12:23:02.164+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>vim 7.3 beta</title><content type='html'>Недавно вышла бета будущего &lt;a href="http://groups.google.com/group/vim_dev/browse_thread/thread/952942e9c515e536"&gt;vim 7.3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Одно из интересных нововведений — вечное UNDO. Теперь вся история редактирования файла хранится не только в рамках текущей сессии, но и при перезапусках. Например, можно будет увидеть состояние файла годичной давности. Конечно, при использовании svn это не так актуально, но не всё ведь хранится в свн. А бэкапы делать лень. &lt;br /&gt;&lt;br /&gt;По умолчанию фича отключена, чтобы ею воспользоваться, достаточно добавить в vimrc файл строку:&lt;br /&gt;&lt;br /&gt;set undofile&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Появилась возможность нумеровать строки не относительно начала файла, а относительно текущего положения курсора. Удобно при выполнении команд, для которых нужно считать строки. Включается командой&lt;br /&gt;&lt;br /&gt;set relativenumber&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Появилась возможность подсвечивать определенные столбцы в буфере, включается командой&lt;br /&gt;&lt;br /&gt;set colorcolumn=…&lt;br /&gt;&lt;br /&gt;Где вместо … нужно указать через запятую номера столбцов, которые нужно подсветить. Я у себя выставил «set colorcolumn=81» чтобы видеть какие строки не влезли в 80 символов.&lt;br /&gt;&lt;br /&gt;Вот как у меня выглядят последние две фичи:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://s005.radikal.ru/i211/1007/36/b30ae0469d57.png" &gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1902140542606499431?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1902140542606499431/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/07/vim-73-beta.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1902140542606499431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1902140542606499431'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/07/vim-73-beta.html' title='vim 7.3 beta'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-1688957228489645225</id><published>2010-07-24T00:50:00.000+04:00</published><updated>2010-07-24T01:04:21.830+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fpc'/><category scheme='http://www.blogger.com/atom/ns#' term='dpp'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>dpp: персморт концепции</title><content type='html'>Изначально я предполагал, что моя утилитка &lt;a href="http://keyfighter.blogspot.com/2010/05/blog-post.html"&gt;dpp&lt;/a&gt; для препроцессинга сурсов на паскале будет строчно-ориентирована. Т.е. ключевые строки программы (объявление класса, функции, слова «interface» и «implementation») должны были бы занимать одну строку, а dpp может только дописывать в конец некоторым строкам какой-то код.&lt;br /&gt;&lt;br /&gt;Объяснял я это тем, что от этого будет проще жить. Однако, напротив, начался адский кошмар и говнокод.&lt;br /&gt;&lt;br /&gt;Поэтому я принял решение полностью отказаться от концепции строчно-ориентированности, ввёл новый синтаксис для dpp-макросов и начал с нуля.&lt;br /&gt;&lt;br /&gt;А именно, код для dpp должен находится внутри блока #(…). Например, уже реализована конструкция&lt;br /&gt;&lt;br /&gt;#(return A)&lt;br /&gt;&lt;br /&gt;Которую dpp заменяет на &lt;br /&gt;&lt;br /&gt;begin Result := A; Exit end&lt;br /&gt;&lt;br /&gt;Хотя только что мне пришла в голову идея реализовать конструкцию с возможностью вставки нескольких операторов, т.е.&lt;br /&gt;&lt;br /&gt;#(return A1 A2 … AN)&lt;br /&gt;&lt;br /&gt;развернётся в&lt;br /&gt;&lt;br /&gt;begin A1; A2; … A(N-1); Result := AN; Exit end&lt;br /&gt;&lt;br /&gt;Теперь у меня серьезные проблемы с тем, что некоторые команды должны не только генерировать код прям на месте, но и добавлять какой-то код в другие части проекта. (К примеру, лямбда-функции должны добавлять свой код в implementation-секции модуля.) А это без предположения о строчном разбиении задача не минутная.&lt;br /&gt;&lt;br /&gt;Но нет худа без добра, и возможно, что будет возможность писать макросы на лиспе, командой #(lisp …).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1697779524607396596-1688957228489645225?l=keyfighter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keyfighter.blogspot.com/feeds/1688957228489645225/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keyfighter.blogspot.com/2010/07/dpp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1688957228489645225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1697779524607396596/posts/default/1688957228489645225'/><link rel='alternate' type='text/html' href='http://keyfighter.blogspot.com/2010/07/dpp.html' title='dpp: персморт концепции'/><author><name>Дож</name><uri>http://www.blogger.com/profile/12815369560352263261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_Jq-FVbc-6RI/TE1PP8lZ-cI/AAAAAAAAAB0/xmJWY2o_RWY/S220/833bd0f0dc7d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1697779524607396596.post-2631689960798203528</id><published>2010-07-22T16:45:00.000+04:00</published><updated>2010-07-22T18:02:54.820+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='собственная линейная алгебра'/><title type='text'>Собственная линейная алгебра на лиспе 2</title><content type='html'>Предыдущая версия векторных вычислений замечательно работает с константами. Но что будет, если сложить два вектора, которые получены функцией с побочным эффектом?&lt;br /&gt;&lt;br /&gt;Пусть, например, есть такие две функции&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defun&lt;/font&gt;&amp;nbsp;get-vector-one&amp;nbsp;&lt;font color="#00af87"&gt;()&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;print&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-one&amp;quot;&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#87afaf"&gt;1.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0.0&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defun&lt;/font&gt;&amp;nbsp;get-vector-two&amp;nbsp;&lt;font color="#00af87"&gt;()&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;print&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-two&amp;quot;&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#87afaf"&gt;0.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;2.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0.0&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Тогда вызов &lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;add3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;get-vector-one&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;get-vector-two&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;выдаст:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-one&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-two&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-one&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-two&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-one&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#87afaf"&gt;&amp;quot;get-vector-two&amp;quot;&lt;/font&gt;&lt;br /&gt;#&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#87afaf"&gt;1.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;2.0&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;0.0&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Получается, что обе функции будут вызваны трижды. Чтобы понять почему это так, можно посмотреть во что развернется макрос add3f в этом вызове:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#0087af"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;macroexpand&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;add3f &lt;font color="#00af87"&gt;(&lt;/font&gt;get-vector-one&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;get-vector-two&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;MAKE-ARRAY&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;3&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;:ELEMENT-TYPE&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;SINGLE-FLOAT&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;:INITIAL-CONTENTS&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;LIST&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-X&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-ONE&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-X&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-TWO&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Y&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-ONE&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Y&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-TWO&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Z&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-ONE&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Z&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-TWO&lt;font color="#00af87"&gt;)))))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Вот такой вот код получится при компиляции. Данное явление является нежелательным не только потому, что лишние побочные действия могут что-нибудь испортить, но и потому, что это может занять много времени на вычисление.&lt;br /&gt;&lt;br /&gt;Решение проблемы заключается в том, чтобы ввести вспомогательные переменные при помощи конструкции (let (...) ...) и вычислить значения параметров один раз в эти вспомогательные переменные. Фактически, хочется чтобы при раскрытии «(add3f (get-vector-one) (get-vector-two))» получалось:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;LET&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;TEMP1&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-ONE&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;TEMP2&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;GET-VECTOR-TWO&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-X&amp;nbsp;TEMP1&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-X&amp;nbsp;TEMP2&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Y&amp;nbsp;TEMP1&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Y&amp;nbsp;TEMP2&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Z&amp;nbsp;TEMP1&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;VEC3F-Z&amp;nbsp;TEMP2&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Чтобы не заморачиваться с тем, как называть временные переменные, в Common Lisp есть функция GENSYM, которая возвращает уникальный символ, которым не пользовались и не воспользуются где-то еще. Теперь макрос add3f будет совершать еще два действия: во-первых, создавать на каждый входной параметр уникальный символ функцией GENSYM, и, во-вторых, генерировать конструкцию LET с необходимыми присвоениями:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;add3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;rest&lt;/font&gt;&amp;nbsp;vecs&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Сложение векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;gensyms&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,g&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Абсолютно тоже самое нужно проделать и для разности. Для остальных векторных макросов с фиксированным кол-вом параметров все гораздо проще, можно воспользоваться известным макросом once-only. Изначально в Common Lisp его вроде как нет, но его легко можно написать самому, или взять &lt;a href="http://lisper.ru/pcl/macros-defining-your-own#Другой классический макрос, создающий макросы: ONCE-ONLY"&gt;отсюда&lt;/a&gt;:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;once-only&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;rest&lt;/font&gt;&amp;nbsp;names&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;&amp;amp;body&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;gensyms&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;collect&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,g&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;collect&amp;nbsp;`&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,,g&amp;nbsp;,,n&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,n&amp;nbsp;,g&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;))&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Суть его проще всего понять на примере. Вот так вот выглядит исправленная версия mul3f:&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;mul3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Покомпонентное умножение вектора v на скаляр s&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;once-only обеспечивает одноразовое вычисление переданных ей параметров.&lt;br /&gt;&lt;br /&gt;Наконец, под катом привожу полный код текущей версии векторной математики:&lt;br /&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;once-only&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;rest&lt;/font&gt;&amp;nbsp;names&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;&amp;amp;body&lt;/font&gt;&amp;nbsp;body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;gensyms&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;collect&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,g&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;collect&amp;nbsp;`&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,,g&amp;nbsp;,,n&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;names&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,n&amp;nbsp;,g&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@body&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;))&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;x&amp;nbsp;y&amp;nbsp;z&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Создание вектора по координатам&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;make-array&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;3&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;:element-type&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;single-float&lt;/font&gt;&amp;nbsp;&lt;font color="#87af87"&gt;:initial-contents&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;list&lt;/font&gt;&amp;nbsp;,x&amp;nbsp;,y&amp;nbsp;,z&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#8787af"&gt;;;; Привычное обращение к координатам вектора&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;vec3f-x&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;elt&lt;/font&gt;&amp;nbsp;,v&amp;nbsp;&lt;font color="#87afaf"&gt;0&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;vec3f-y&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;elt&lt;/font&gt;&amp;nbsp;,v&amp;nbsp;&lt;font color="#87afaf"&gt;1&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;vec3f-z&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;elt&lt;/font&gt;&amp;nbsp;,v&amp;nbsp;&lt;font color="#87afaf"&gt;2&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;mul3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Покомпонентное умножение вектора v на скаляр s&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;div3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Покомпонентное деление вектора v на скаляр s&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&amp;nbsp;s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;/&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;/&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;/&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;,s&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;dot3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;a&amp;nbsp;b&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Скалярное произведение векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;a&amp;nbsp;b&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;qlen3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Квадрат длины вектора&amp;quot;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;dot3f&amp;nbsp;,v&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;len3f&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Длина вектора&amp;quot;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;sqrt&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;qlen3f&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;norm3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Нормирование вектора&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;div3f&amp;nbsp;,v&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;len3f&amp;nbsp;,v&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;add3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;rest&lt;/font&gt;&amp;nbsp;vecs&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Сложение векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;gensyms&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,g&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;+&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;sub3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#87af87"&gt;&amp;amp;rest&lt;/font&gt;&amp;nbsp;vecs&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Вычитание векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;((&lt;/font&gt;gensyms&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;gensym&lt;/font&gt;&lt;font color="#00af87"&gt;))))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;&lt;font color="#0087af"&gt;let&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;loop&lt;/font&gt;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;gensyms&amp;nbsp;for&amp;nbsp;v&amp;nbsp;in&amp;nbsp;vecs&amp;nbsp;collect&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;,g&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-x&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-y&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;,@&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;'&lt;/font&gt;&lt;font color="#00afaf"&gt;list&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;lambda&lt;/font&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;v&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f-z&amp;nbsp;,v&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;gensyms&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;cross3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;a&amp;nbsp;b&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Векторное произведение векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;once-only&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;a&amp;nbsp;b&lt;font color="#00af87"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;vec3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,b&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-z&amp;nbsp;,b&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;-&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,b&lt;font color="#00af87"&gt;))&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;*&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-y&amp;nbsp;,a&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;vec3f-x&amp;nbsp;,b&lt;font color="#00af87"&gt;)))&lt;/font&gt;&lt;font color="#8700d7"&gt;)&lt;/font&gt;&lt;font color="#00af87"&gt;))&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00af87"&gt;(&lt;/font&gt;&lt;font color="#0087af"&gt;defmacro&lt;/font&gt;&amp;nbsp;triple3f&amp;nbsp;&lt;font color="#00af87"&gt;(&lt;/font&gt;a&amp;nbsp;b&amp;nbsp;c&lt;font color="#00af87"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#87afaf"&gt;&amp;quot;Смешанное произведение векторов&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8700d7"&gt;`(&lt;/font&gt;dot3f&amp;nbsp;&lt;
