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

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

ноября 26, 2010

Hex-константы и хедеры

Не могу решить какую запись hex-констант на DEmbro выбрать в качестве основной. (Основной, потому что в языке будeт возможность для реализации любого способа.)

Во-первых, что лучше — обозначать hex-константу префиксом или постфиксом? Мне привычней префикс, но это лишь вопрос привычки, зато парсинг немного проще.

Логичней всего использовать букву h (принято в asm'ах, но у них это не префикс, а постфикс):
hFFF1

Однако, есть опасения, что это ненаглядно, и может с непривычки сливаться с другими буквами hex-константы, особенно если писать их в одинаковом регистре.

С++ стиль (префиксные символы 0x перед цифрами)
0xFFF1
неудачен тем, что на него требуется два символа, а хочется задействовать только один.

А Delphi-стиль (префикс $ перед цифрами)
$FFF1
хоть и не очень распространён и не логичен, выглядит наиболее удобным — особый символ, не сливающийся с цифрами.

Пока что я избрал первый вариант, посмотрим приживётся или нет.

Пишу тут заголовок для WinApi windows.de на DEmbro. Из-за многих недоработок языка выглядит непричёсанным, но всё по-взрослому: с переобозначением типов, объявлением констант, объявлением прототипов функций с автоматической их загрузкой в период выполнения (т.е. не при подключении библиотеки, а при вызове функции windows-load этой библиотеки). Когда требуется добавить новую функцию в хедер, достаточно прописать её прототип один раз, не нужно копипастить что-то в стиле
typedef ... (*SomeFunc_t)(....);
...
extern SomeFunc_t SomeFunc;
...
SomeFunc = (SomeFunc_t)GetProcAddress(libuser32, "SomeFunc");

Одна моя мечта сбылась *.* Йииехуууууу!


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

ноября 23, 2010

Разные файлы — разные настройки

По мере того, как я плотнее программирую на нескольких языках, всё больше становится необходимо задавать под разные типы файлов совершенно разные настройки. Например, сворачивание текста (folding) в исходниках для Free Pascal я оформляю конструкцией REGION (для совместимости с IDE Delphi), а в DEmbro обычным вимовским образом.

Штатный вариант это сделать: поправить файлы filetype-настроек (синтаксиса, компилятора или другие подобные) — но почему-то не хочется в них разбираться, хочется всё просто описать в «.vimrc».

А в «.vimrc» это сделать так просто нельзя: опция filetype будет вычислена уже после выполнения «.vimrc», т.е. в «.vimrc» будет не доступна. А нам нужно внутри «.vimrc» сделать в случае одного filetype одни настройки, а в случае другого filetype — другие.

Один из трюков заключается в следующем: описываем настройки в виде функции:

function DEmbroMarker()
  set fdm=marker
  set commentstring=//%s
  set foldmarker={{{,}}}
endfunction


А потом, в самом конце, прописываем условное действие при запуске всех файлов:

au BufRead,BufNewFile *         if &ft == 'dembro' | call DEmbroMarker() | endif


Аналогично для другого типа файла (в моём случае, для pascal'я).


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

MessageBox

Только что моя прога на DEmbro смогла вывести на экран виндовый message box. Доволен как слон.

В целом, темпы очень маленькие, много ленюсь.


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

ноября 15, 2010

Name typization

Ночью, когда спал, придумал механизм типизированных имён.

Динамическая типизация — это когда переменная может принимать значение любого
типа. Как только с переменной нужно проделать какое-то действие (сложение, например),
интерпретатор узнаёт тип переменной, и в зависимости от этого выбирает операцию.
Это очень удобно, не нужно заботиться о явном указании типа. Но работает медленней.

Статическая типизация — это когда у каждой переменной заранее указывается тип,
и к моменту выполнения операции (сложения, например) понятно что нужно делать.
Но указывать типы переменных нужно везде. Это не очень удобно, и мне всегда
этим не нравилась статическая типизация.

[Upd] Всё, что идёт ниже, про упрощение статической типизации.

Я осознал, что бывают такие переменные, у которых всегда один и тот же тип.
Например, у меня переменные I и J всегда имеют тип Integer, переменные
Name и FileName тип TString, P тип Pointer и т.д. Было бы весьма удобно иметь
возможность указать привязанные к именам типы, чтобы потом их явно не
указывать. Как-то так:


typization I, J, N, M, K: Integer;
typization Name, FileName, Dir: TString;

procedure LoadFilesInDir(Dir);
var
  Files: TArrayOfString;
  I;
begin
  GetFilesInDir(Dir, Files);
  for I := 0 to High(Files) do
    LoadFile(Files[I]);
end;


При этом если нужно, то у переменных с такими названиями можно вручную указать
другой тип.

К примеру, в математическом модуле, все переменные с именами M, H, Mat, Matrix будут
являться матрицами, V, A, B, Vec, Vector — векторами, Q, R, Quat и Quaternion —
кватернионами и т.д. Вот было бы хорошо, если бы можно было делать так


typization M, H, Mat, Matrix: TMat4f;
typization V, A, B, Vec, Vector: TVec3f;
typization Q, R, Quat, Quaternion: TQuat;

function Add3f(A, B): TVec3f;
function Dot3f(A, B): TVec3f;
function Cross3f(A, B): TVec3f;
function Len3f(V): Single;

function Apply3f(M, V): TVec3f; overload;
function Apply3f(Q, V): TVec3f; overload;


Возможно, что иногда даже можно бы было не объявлять переменную, компилятор сам
бы создал локальную с таким именем. Например, если в функции используется
переменная I, то скорее всего она локальная и имеет тип Integer (потому что этот
тип указан в typization секции).


procedure LoadFilesInDir(Dir);
var
  Files: TArrayOfString;
begin
  GetFilesInDir(Dir, Files)
  for I := 0 to High(Files) do
    LoadFile(Files[I]);
end;


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

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

Обо мне

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