Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1296814094
Медвежонок ХМЛ
2011-02-04 13:08
2011.05.22
Наверное это тоже смешно


2-1297442025
Token
2011-02-11 19:33
2011.05.22
TTreeView и галочки


13-1126698091
DenisUA
2005-09-14 15:41
2011.05.22
Подскажите задачу!


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


15-1296342105
@!!ex
2011-01-30 02:01
2011.05.22
Delphi ломает hadl linkи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский