Не могу решить какую запись 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");
Одна моя мечта сбылась *.* Йииехуууууу!
Добро пожаловать!
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.
ноября 26, 2010
Hex-константы и хедеры
ноября 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;
Читать дальше......