Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

августа 30, 2010

Автоматизация в обычной жизни: исправление субтитров

В одном из фильмов не загружались субтитры. Решил посмотреть что не так, файл с субтитрами выглядел так

00:01:40.12,00:01:41.34
Dear God

00:01:41.44,00:01:44.15
Cut it off! His arm - cut it off!

00:01:58.92,00:02:00.23
Is he dead?

00:02:00.32,00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.

00:02:03.16,00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.

00:02:06.44,00:02:09.43
Hey! You two. Get him back. Back!

00:02:11.32,00:02:14.91
We're in! Do you hear? They cheer!

00:02:15.00,00:02:16.95
Cuidad Rodrigo is taken

00:02:17.04,00:02:19.63
Oh. He looks dead to me.
...

А чтобы субтитры прочитались в моём плеере (GOMPlayer), он должен был выглядеть так:

0
00:01:40.12 --> 00:01:41.34
Dear God

1
00:01:41.44 --> 00:01:44.15
Cut it off! His arm - cut it off!

2
00:01:58.92 --> 00:02:00.23
Is he dead?

3
00:02:00.32 --> 00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.

4
00:02:03.16 --> 00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.

5
00:02:06.44 --> 00:02:09.43
Hey! You two. Get him back. Back!

6
00:02:11.32 --> 00:02:14.91
We're in! Do you hear? They cheer!

7
00:02:15.00 --> 00:02:16.95
Cuidad Rodrigo is taken

8
00:02:17.04 --> 00:02:19.63
Oh. He looks dead to me.
...

Т.е. нужно добавить нумерацию и заменить запятые на стрелочки. Строк в файле 3438, вручную его править нет никакого желания. Поэтому я решил автоматизировать этот процесс.

Чтобы заменить запятые на стрелочки, можно воспользоваться макросами в виме. В первой строке выполняем
    qw0f,cl --> <ESC>jjjq
Это создаст макрос на букве w, меняющий в текущей строке первую запятую на стрелочку и смещающий курсор на три строки вниз. Осталось теперь несколько раз набрать
    1000@w
и все запятые будут заменены на стрелочки.

Теперь перейдём к нумерации. Тут мы воспользуемся M4, а именно пригодится макрос incr, который предназначен для увеличения своего параметра на единицу. Например, incr(`17') выдаст 18.

Будем хранить в переменной count кол-во занумерованных строк:
    define(`count',`0')
а макрос current будет подставлять очередной номер субтитра и увеличивать count на 1:
    define(`current',`define(`count',incr(count))count')
Эти два определения нужно расположить в самом начале файла.

Теперь вставляем current перед описанием каждого субтитра — используем тот же приём, что и при замене запятых, только создание макроса будет выглядеть так (предполагается, что курсор находится на пустой строке):
    qwocurrent<ESC>jjjq

Осталось скормить это в m4:
    m4 subtitles.srt4 > subtitles.srt

Всё, теперь субтитры грузятся и работают.

Осталась совсем маленькая деталь — в субтитрах можно обнаружить команду [br]. Она предназначена для разбиения субтитров на несколько строк, однако, GOMPlayer это игнорирует и отображает её как текст. Чтобы заменить все вхождения [br] на разбиение строк, достаточно выполнить команду
    :%s/\[br\]/\r/g


Читать дальше......

августа 28, 2010

DForth: продвижения 3

Устроил полный рефакторинг. Почти готова возможность подключения внешних библиотек.

Сразу после запуска доступно 525 команд — вышло много комбинаторных взрывов с типизированными командами. В этом деле M4 очень помогает избежать копипаста.


Читать дальше......

августа 16, 2010

DForth: продвижения 2

Появились функции (т.е. объявление своих команд через двоеточие, в том числе immediate), работа с двумя видами строк.

Уже продумал как будет оформляться вызов функций из внешних динамических библиотек.

Читаю потихоньку стандарт forth-94.


Читать дальше......

августа 08, 2010

DForth: продвижения

Написал генерацию шитого кода, его исполнение (первоначально была написана чистая интерпретация). Написал команды branch, ?branch, >mark и >resolve, позволяющие реализовывать условные и безусловные переходы. Когда добавлю возможность объявлять свои команды (т.е. функции) — средств будет достаточно, чтобы на самом DForth'е реализовать оператор if.

Научился создавать пустой исполняемый файл (который ничего не делает) для Win32. Убил на это три дня :)

Прочитал стандарт forth-83. Весьма примитивно, я ожидал чего-то бо́льшего. Но всё равно интересно.


Читать дальше......

августа 05, 2010

Азы M4

Всё описанное должно работать в GNU версии макропрепроцессора m4, в операционной системе Windows XP.

Скачать можно отсюда, в первую очередь требуются Binaries и Dependencies. После размещения m4.exe и regex2.dll в одну папку можно начать пользоваться.

Запуск m4.exe без параметров вызывает прогу в REPL-режиме. Чтобы выйти из m4, нужно набрать m4exit. В этом REPL режиме удобно отлаживать свои наработки.

Чтобы обработать файл, достаточно передать его имя в качестве параметра:
    m4 u1.pas4

При этом m4 выдаст результат в стандартный вывод. Стандартный вывод можно перенаправить в файл:
    m4 u1.pas4 > u1.pas

Если передать несколько файлов, то они будут последовательно выполнены так, как будто это единый файл.
    m4 u1.pas4 u2.pas4 > u.pas

Это было то, что касается запуска m4, теперь приступим к собственно использованию. m4 ищет в поступающем тексте макросы и исполняет их. Например, макрос __file__ заменяется на название текущего файла, а __line__ на номер текущей строки.

В m4 есть такое понятие, как цитата, по умолчанию цитаты должны быть заключены в кавычки (обратите внимание, что они разные)
  `это цитата'

К примеру, если у вас в тексте встречается __file__, которое не должно быть заменено на имя файла, то его нужно оформить в виде цитаты
  `__file__'
m4 при этом отбросит кавычки и останется только __file__.

При помощи макроса changequote можно сменить символы, отвечающие за кавычки:
  changequote({,})
После этого цитаты можно оформлять в виде:
  {__file__}

Замена стандартных ограничителей цитат полезна при написании программ на паскале, ­ в котором строковые выражения заворачиваются в одинарные кавычки, что может сбить с толку m4.

Вернём стандартные цитатные символы
  changequote(`,')

Собственные макросы объявляются при помощи макроса define. Первый переданный ему параметр задаёт имя макроса, а второй тело.
  define(`foo', `bar')

Макрос foo будет просто заменяться на bar. $1, $2, $3 и т.д. в теле макроса заменяются на переданные параметры. Например:
  define(`assign', `$2 := $1')
  assign(a+b, c)

выведет «c := a+b»

Изученного уже достаточно чтобы написать макрос assert для проверки истинности утверждения:
  changequote(~,")
  define(~assert", ~if not ($1) then begin Writeln('Assert error $1 in __file__:__line__') end")


Пример использования:
  assert(Obj <> nil);


Читать дальше......

августа 04, 2010

M4

Я вот пишу свою прогу для препроцессинга сурсов (dpp), а тут вдруг обнаружил программку M4:
http://lib.custis.ru/M4

Она предназначена для препроцессинга исходников на основе макросов. Т.е. именно то, чего мне так не хватает. Круто! Теперь буду её изучать.


Читать дальше......

августа 03, 2010

DForth

Недавно начал читать про язык Forth, мне понравились некоторые идеи, но как-то влом его досконально изучать. Поэтому я решил реализовать свой форт, под названием DForth. Пишу его на языке free pascal.

За сегодня написал основные команды работы со стеком для всех видов целых чисел, арифметические операции для них же, вывод их в консоль, функции сравнения и булевы операции. Это всё вылилось в 210 команд! Не хило так... И это я ещё не приступил ни к чему содержательному, совсем.

Написал REPL режим (интерактивный в консоли) и динамическую библиотеку для использования DForth в качестве скриптового движка.

Начал изучать как создаются exe-файлы в win32, благо это есть в исходниках fpc :) Поэтому скоро мой DForth станет одновременно компилятором, интерпретатором и скриптовым движком.


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru