Форум: "Прочее";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];
ВнизЕсть интересная задача Найти похожие ветки
← →
oxffff © (2011-02-02 10:22) [40]
> Alkid © (02.02.11 10:16) [39]
>
> > oxffff © (02.02.11 09:52) [38]
> > Пока немного, но я быстро учусь.
>
> А чем был обусловлен выбор Паскаля, как отправной точки?
>
Мне нравится begin ... end, а не {....}.
:)))))))))))))
← →
Alkid © (2011-02-02 10:23) [41]
> oxffff © (02.02.11 10:22) [40]
> Мне нравится begin ... end, а не {....}.
> :)))))))))))))
Сурово! А мне нравится, когда нет ни begin/end, ни когда {...}
:)
← →
И. Павел © (2011-02-02 10:28) [42]> Сурово! А мне нравится, когда нет ни begin/end, ни когда {...}
Если совсем без end/endif, то, наверное, только так:if ...
goto A
else
goto B
A:
...
goto C
B:
...
C:
:)
← →
Омлет © (2011-02-02 10:35) [43]Могу помочь с сайтом. В язык вникать пока нет времени..
← →
Alkid © (2011-02-02 10:36) [44]
> И. Павел © (02.02.11 10:28) [42]
> Если совсем без end/endif, то, наверное, только так:
Долой statements!
Даешь комбинацию выражений!
← →
Дмитрий С © (2011-02-02 13:52) [45]
>
> Собственно если бы тебе удалось разобраться как описать
> например функцию с 2 параметрами(функция складывает эти
> числа и возвращает в качестве результата), а сама программа
> просто вызывает эту функцию.
> Я гуглил, есть русскоязычные примеры как это сделать.
> То остальное дело техники.
>
Мы, похоже, даже разговариваем на разных языках. Для меня то что ты сказал, это лишьfunction (a,b:integer):integer; begin exit(a+b); end;
Но, немного зная тебя, не все так просто..
← →
Ega23 © (2011-02-02 14:05) [46]
> Для меня то что ты сказал, это лишь
А RangeCheck как же?
← →
Alkid © (2011-02-02 14:21) [47]Кстати, а почему не использовать как back-end обычный паскаль?
Free pascal тот же. Или б-гмерзкий C, например.
← →
oxffff © (2011-02-02 14:22) [48]
> Дмитрий С © (02.02.11 13:52) [45]
>
> >
> > Собственно если бы тебе удалось разобраться как описать
>
> > например функцию с 2 параметрами(функция складывает эти
>
> > числа и возвращает в качестве результата), а сама программа
>
> > просто вызывает эту функцию.
> > Я гуглил, есть русскоязычные примеры как это сделать.
> > То остальное дело техники.
> >
>
> Мы, похоже, даже разговариваем на разных языках. Для меня
> то что ты сказал, это лишь function (a,b:integer):integer;
> begin exit(a+b); end;
> Но, немного зная тебя, не все так просто..
Попробую прояснить.
Вот функция генерации кода для конструкции FOR в YAR. В качестве параметра абстрактный класс backend(.NET, LLVM, JAVA....)
Получается в каком то смылсе это обобщенный алгоритм ( метакод :) )
procedure TForToStatement.ToBackEnd(BackEnd: TAbstractBackEnd);
var
CmpValue: TTemporaryLocation;
IntValue: TCodeGenValueObject;
BodyHandle, EndHandle: Cardinal;
begin
CmpValue := TTemporaryLocation.create("",IntegerType,ValueFlagValue);
IntValue := CodeGenConstantInt_One;
BodyHandle := BackEnd.LabelAlloc;
EndHandle := BackEnd.LabelAlloc;
TExpressionCodeGenerator.CodeGeneratorAssign(BackEnd, Counter, ExprFrom,
OpAssign);
TExpressionCodeGenerator.CodeGeneratorAssign(BackEnd, ActualTo,
ExprTo, OpAssign);
BackEnd.LabelInitialize(BodyHandle);
BackEnd.CompareGreater(Counter, ActualTo, CmpValue);
BackEnd.CJmpOnTrue(CmpValue, EndHandle);
TExpressionCodeGenerator.CodeGeneratorOp(BackEnd, ExprBody);
BackEnd.Add(Counter, IntValue, Counter);
BackEnd.Jmp(BodyHandle);
BackEnd.LabelInitialize(EndHandle);
end;
Собственно в LLVM есть нечто схожее.
http://habrahabr.ru/blogs/programming/102597/#habracut
← →
oxffff © (2011-02-02 14:32) [49]
> Alkid © (02.02.11 14:21) [47]
> Кстати, а почему не использовать как back-end обычный паскаль?
>
Сейчас я формирую текстовый IL файл для .NET и отдаю его ILASM.
Собственно можно напрямую формировать PE файл(знания и опыт есть однако я не мазохист) и таблицы метаданных .NET, либо частично упростить себе жизнь использовав
.NET unmanaged API
Попросив меня
http://santonov.blogspot.com/2010/07/working-with-net-unmanaged-api.html
Можно все. Однако над LLVM работает не один человек.
И есть готовые оптимизации кода. Бери и используй. Love it, fu.. it.
← →
TUser © (2011-02-02 14:38) [50]пока пишешь
begin
, можно мысль думать
а на{
я не не успеваю
← →
jack128_ (2011-02-02 14:43) [51]Я перестал любить begin end после такого кода:
FBranchName := TLazy<string>.Create(function (): string
begin
Result := TIBDataModule.Execute<string>(function (DM: TIBDataModule): string
begin
Result := DM.BranchName
end);
end);
для сравнения C#branchName = new Lazy<string>(() => IBDataModule.Execute(dm => dm.BranchName));
← →
И. Павел © (2011-02-02 14:46) [52]> branchName = new Lazy<string>(() => IBDataModule.Execute(dm => dm.BranchName));
И это по вашему читабельный код?
← →
oxffff © (2011-02-02 14:51) [53]Лямбда выражения - это просто другая запись + вывод типов
← →
oxffff © (2011-02-02 16:42) [54]Сегодня добавил:
getmem,freemem (на базе heapalloc,heapcreate,heapdestroy,heapfree)
и pointer math
Теперь можно так
program myprogram;
procedure dosample();
p:pointer;
pinteger:^integer;
i:integer;
begin
GetMem(p,100);
pinteger:=p;
for i:=0 to 99 do pinteger[i]^:=i;
for i:=0 to 99 do write pinteger[i]^;
FreeMem(p);
end;
begin
dosample();
end
← →
Styx (2011-02-02 18:33) [55]
> Если совсем без end/endif, то, наверное, только так:
Это Python
← →
Alkid © (2011-02-02 19:52) [56]
> И. Павел © (02.02.11 14:46) [52]
> > branchName = new Lazy<string>(() => IBDataModule.Execute(dm
> => dm.BranchName));
>
> И это по вашему читабельный код?
Да, это вполне читабельный код. Синтаксис вида ... => ... для анонимных функций намного лучше, чем function (...) : ... begin Result := ...; end;
← →
oxffff © (2011-02-03 11:55) [57]
> GetMem(p,100);
Никто не заметил.
GetMem(p,400).
Кстати в Delphi сигнатура метода GetMem неправильная.
GetMem(var p:pointer;size:integer).
Однако позволяет делать так
a:pointer;
b:^integer;
GetMem(a,100);
GetMem(b,1); <-это ошибка.
Поскольку типы var параметра должны быть идентичны. Однако для псевдофункции сделано исключение. :)
← →
DiamondShark © (2011-02-03 13:24) [58]
> pinteger[i]^:=i
Бред какой.
> Кстати в Delphi сигнатура метода GetMem неправильная.
"Это головушка у тебя деревянная, а палочка-то волшебная"
Для типизированных указателей есть встроенная процедура/функция new().
← →
oxffff © (2011-02-03 14:12) [59]
> DiamondShark © (03.02.11 13:24) [58]
>
> > pinteger[i]^:=i
>
> Бред какой.
Учите мат. часть.
>
>
> > Кстати в Delphi сигнатура метода GetMem неправильная.
>
> "Это головушка у тебя деревянная, а палочка-то волшебная"
>
> Для типизированных указателей есть встроенная процедура/функция
> new().
Вдыхайте глубже. Тут про Ерему, а не про Фому.
← →
DiamondShark © (2011-02-03 15:06) [60]Удалено модератором
← →
oxffff © (2011-02-03 15:18) [61]
> DiamondShark © (03.02.11 15:06) [60]
Pointer Math (Delphi)
Switch
Syntax
{$POINTERMATH ON} or {$POINTERMATH OFF}
Remarks
Pointer math is simply treating any given typed pointer in some narrow instances as a scaled ordinal where you can perform simple arithmetic operations directly on the pointer variable. It also allows you to treat such a pointer variable as an unbounded array using the array [] operator.
← →
oxffff © (2011-02-03 15:20) [62]Удалено модератором
← →
DiamondShark © (2011-02-03 15:41) [63]
> It also allows you to treat such a pointer variable as an
> unbounded array using the array [] operator
Выражениеpinteger[i]
уже имеет тип integer.
Оператор разыменования (крышка "^") там нафиг не упал.
Если в твоём квадратноколёсном велосипеде требуется разыменование, то ты явно что-то не то курил, потому в трезвом уме невозможно представить, к чему там можно применить разыменование:
-- оператор [] УЖЕ трактует поинтер как массив, без явного разыменования
-- оператор [] возвращает ЭЛЕМЕНТ массива, к которому разыменование не применимо
В общем, учи матчасть, ага.
← →
oxffff © (2011-02-03 15:51) [64]
> DiamondShark © (03.02.11 15:41) [63]
>
> > It also allows you to treat such a pointer variable as
> an
> > unbounded array using the array [] operator
>
> Выражение pinteger[i] уже имеет тип integer.
> Оператор разыменования (крышка "^") там нафиг не упал.
>
> Если в твоём квадратноколёсном велосипеде требуется разыменование,
> то ты явно что-то не то курил, потому в трезвом уме невозможно
> представить, к чему там можно применить разыменование:
> -- оператор [] УЖЕ трактует поинтер как массив, без явного
> разыменования
> -- оператор [] возвращает ЭЛЕМЕНТ массива, к которому разыменование
> не применимо
>
> В общем, учи матчасть, ага.
Поменять в сигнатуре метода результат как Byref мне не составить труда.
Однако пока выбор сделан в пользу того, чтобы возвращался такой же неразыменованный указатель. Так что различия есть.
Однако я рад, что ты ознакомился с мат. частью.
← →
DiamondShark © (2011-02-03 16:06) [65]
> Однако пока выбор сделан в пользу того, чтобы возвращался
> такой же неразыменованный указатель.
Щито?
Выражениеpinteger[i]
возвращает^integer
?
Не. Колёса у тебя не квадратные. Они у тебя в форме бутылки Клейна.
← →
oxffff © (2011-02-03 16:21) [66]
> DiamondShark © (03.02.11 16:06) [65]
Это не существенное отличие.
Если будет неудобно, изменить на возврат ссылки несложно.
← →
DiamondShark © (2011-02-03 16:48) [67]
> oxffff © (03.02.11 16:21) [66]
Ну, если СЕМАНТИКА выражения -- несущественное отличие, то я не знаю тогда, что будет существенным отличием. Наверное, фигурная скобка от бегина.
Пока же можно констатировать два с половиной факта:
1. Блэкджек и шлюхи детектед.
2. Типовые сценарии использования языковых конструкций не рассматривались ваще.
2.5 Сколь-нибудь систематический дизайн языка отсутствует.
Налегайте, налегайте на матчасть. У вас ещё остались непристроены нестирающиеся шины и регенерирующий реактор на субтепловых нейтронах.
← →
oxffff © (2011-02-03 17:21) [68]
> DiamondShark © (03.02.11 16:48) [67]
Переделал, как привыкли люди. [] - возвращает ссылку.
По остальному. Доктором работаешь?
← →
DiamondShark © (2011-02-03 17:55) [69]
> Доктором работаешь?
Угу. Эвтаназиологом.
Есть ещё хорошее предложение.
Если уж реализовывать указательную арифметику, неплохо бы поддержать типизированные указатели. Для чего расширить синтаксис интринсикаNew
:
type
PMyType = ^TMyType;
var
p: PMyType;
begin
//функциональный вариант
p := New(PMyType, N); // распределяет N элементов TMyType
//проседурный вариант
New(p, N); // распределяет N элементов TMyType
А возможность использовать типизированный указатель вGetMem
выпилить к свиньям.
← →
oxffff © (2011-02-03 19:47) [70]
> DiamondShark © (03.02.11 17:55) [69]
Предложения я люблю
Типизированные указатели уже есть.
Однако не смысла усложнять. Можно по старинке.
TStaticArray<T>= array[0..99] of T;
PStaticArray<T>= ^TStaticArray<T>;
p:PStaticArray<integer>;
New(p);
Либо массивы
> А возможность использовать типизированный указатель в GetMem
> выпилить к свиньям.
Сомнительно. Оставлю.
← →
oxffff © (2011-02-04 12:09) [71]Добавил sizeof.
Теперь можно так
program myprogram;
procedure pf<T> (cnt:integer);
p:pointer;
ptype:^T;
valueA:T;
i:integer;
begin
GetMem(p,cnt*sizeof(T));
ptype:=p;
for i:=0 to cnt-1 do ptype[i]:=valueA;
FreeMem(p);
end;
begin
pf<boolean> (100);
pf<integer> (200);
pf<double> (300);
end
← →
DiamondShark © (2011-02-04 20:26) [72]
> GetMem(p,cnt*sizeof(T));
Сюда просится расширенный синтаксисNew(ptype, cnt);
GetMem для типизированных указателей выпилить.
Выпилить неявную совместимость по присваиванию указателей.
type
PType = ^_Type;
var
pt: PType;
p: Pointer;
pt:=p; // Нельзя
p:=pt; // Можно
pt:=PType(p); // Можно
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.006 c