Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.22;
Скачать: CL | DM;

Вниз

Есть интересная задача   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.009 c
3-1258970968
denis_7
2009-11-23 13:09
2011.05.22
Проблема с отчетами в Rave


2-1296660428
vegarulez
2011-02-02 18:27
2011.05.22
фото с вебкамеры.


3-1259290992
Diplomat
2009-11-27 06:03
2011.05.22
Поиск заданного значения в БД


2-1297847287
RWolf
2011-02-16 12:08
2011.05.22
AV в API callback


6-1237314496
ID_23587A5E
2009-03-17 21:28
2011.05.22
Unit WinInet , проблема с InternetCloseHandle