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

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

апреля 13, 2009

Кат

Вроде научился делать кат.


Инфу взял отсюда http://seorussian.blogspot.com/2008/12/sdelat-kat-v-blogger-odin-iz-luchshih.html


[updated] Нашёл официальные каты.  


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

Синтаксис в html

Мне приходится время от времени постить исходные коды. Нужно, чтобы они имели подсветку - поэтому без html не обойтись. К счастью, vim умеет генерировать html версию редактируемого файла, для этого нужно набрать
          :TOhtml

Эта команда работает с диапазоном строк, поэтому ее можно использовать и для переконвертирования участка файла (в данном случае от строки 10 до строки 20):
          :10,20TOhtml
или, чтобы не запоминать номера строк, после выделения диапазона (Shift+v) можно набрать
          :'<,'>TOhtml

В результате получаем абсолютно то же самое, что мы видим у себя в редакторе:

//  TEntity//{{{
//      Базовый класс для всех классов в программе
//
//        
TEntity = class
private
  FOwner: TEntity;
  FGrabber: Boolean;
  FHash: Cardinal;
protected
  FName: String;
public
  Constructor Create(Owner: TEntity); virtual;
  Destructor Destroy; override;
  Procedure DoString(S: String); virtual;
  Procedure AssignVar(Name, Value: String); virtual;
  Procedure Render; virtual;
  Procedure Update; virtual;
  Procedure Kill; virtual;
  Procedure OnEvent(Event: TEvent); virtual;
  Procedure SendEvent(Event: TEvent); virtual;
  Procedure SendEventAndFree(Event: TEvent);
  Property Grabber: Boolean read FGrabber;
  Property Owner: TEntity read FOwner;
  Property Hash: Cardinal read FHash;
  Property Name: String read FName;
end;
//}}}

И не забудьте про :help TOhtml


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

апреля 02, 2009

Дополнительные операторы для перегрузки

Не секрет, что во free pascal'е существует возможность перегрузки стандартных операторов. В документации говорится, что есть три типа таких операторов:
1) Арифметические бинарные (+, *, <>, /, **) - любая функция от двух параметров.
2) Операции сравнения (<, >, =, <=, >=) - функция от двух переменных, возвращающая Boolean, причем <> будет сгенерирован автоматически как отрицание к =.
3) Оператор присваивания (:=) - функция принимающая значение одного типа и возвращающая значение другого типа.

Работает это примерно так


Type
TVec3D = Array[0..2] Of Double;

// Скалярное произведение
operator * (A, B: TVec3D) Result: Double;
  Var
    I: Integer;
begin
  Result := 0;
  for I := 0 to 2 do
    Result += A[I] * B[I];
end;

// Угол от A к B в плоскости XY по часовой?
operator > (A, B: TVec3D) Result: Boolean;
begin
  Result := A[0]*B[1] - A[1]*B[0] >= 0;
end;

// Присвоение числа в вектор
operator := (V: Integer) Result: TVec3D;
  Var
    I: Integer;
begin
  for I := 0 to 2 do
    Result[I] := V;
end;


Однако, если покапаться в исходниках free pascal'я (я экспериментировал с 2.2.2, в более поздних версиях что-то может быть не так), то можно обнаружить, что перегрузке поддаются еще и операторы
1) Арифметические ><, or, and, div, mod, shl, shr, xor.
2) Унарные -, not.

Оператор >< в самом языке используется для нахождения симметрической разности двух множеств. Т.е. код


Var
  I: Integer;
  S: Set Of Byte;
...
S := [1, 2, 3, 4, 5] >< [3, 4, 5, 6, 7];
for I := 1 to 7 do
  Write(Ord(I in S));
Writeln;


напечатает 1100011, а в переменной S будет [1, 2, 6, 7].

Его очень удобно использовать для обозначения векторного произведения (чем, кстати и воспользовались разработчики free pascal'я в своем модуле matrix).

mod очень кстати заюзать для создания собственного удобного нахождения остатков.

Согласно комментариям в модуле tockens исходников компилятора перегрузке должны поддаваться еще и as, in, is. Однако, у меня этого сделать почему-то не вышло, наверно к ним нужен какой-то особый подход. Никто не знает какой именно? :)


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

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

Обо мне

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