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

Вниз

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

 
oxffff ©   (2011-02-01 16:16) [0]

Продолжаю пилить свой язык JAR и смотреть вперед.
Уже есть компилятор командной строки, правда он весит 2,6 МБ неупакованный(но в нем есть части которые нужно разнести, вообщем должен быть меньше). :)
Сейчас есть генерация кода для .NET.
Есть задача использовать LLVM в качестве генерации кода на x86 и ряд других платформ.
Кому интересно заняться этой задачей welcome.
Есть задачи писать документацию и организовать сайт.
Свое внимание я бы хотел сосредоточить на front end и выразительной части языка.
Собственно можно поставить дополнительную задачу,организовать совместимость с текущими версиями Delphi на x86 насколько это возможно. Знаю что на этом форуме есть большое количество светлых и умных голов.

Для чего это все: по большей части это мое хобби и огромное желание недеградировать на работе. Возможно если удалось бы поднять проект, то из него можно извлекать выгоду ввиде денег и хорошего портфолио.

Спасибо.

P.S.
Сегодня допилил вывод типов. Например

program myprogram;

Tproc=function (a:integer):integer;

ProcEx:Tproc;

function pf<T>(a:T):integer;
begin
result:=1;
end;

begin
ProcEx:=pf;
write ProcEx(1);
end


 
oxffff ©   (2011-02-01 16:26) [1]

Я смогу привлечь студентов к части работ летом. Есть договоренность с зав. кафедрами на летную практику. Сейчас курсовые уже раздали.
А в качестве дипломного проекта не хочется подставлять студентов нашего вуза. Потянут единицы, но не факт что приемная коммисия оценит. Им нужны инновации в программах. Вообщем клюют на всякие рюшечки.


 
KilkennyCat ©   (2011-02-01 16:34) [2]

а где можно глянуть вообще все?


 
oxffff ©   (2011-02-01 16:41) [3]


> KilkennyCat ©   (01.02.11 16:34) [2]
> а где можно глянуть вообще все?


http://santonov.blogspot.com/


 
Кто б сомневался ©   (2011-02-01 16:41) [4]


> Продолжаю пилить свой язык JAR и смотреть вперед.


А зачем он нужен? Или это просто для практики?


 
Кто б сомневался ©   (2011-02-01 16:43) [5]

Имхо если есть свободное время, то не помешала бы помощь в KOL-CE для WinCE.
Это дело.


 
oxffff ©   (2011-02-01 16:44) [6]


> Кто б сомневался ©   (01.02.11 16:41) [4]
>
> > Продолжаю пилить свой язык JAR и смотреть вперед.
>
>
> А зачем он нужен? Или это просто для практики?


1.Хобби
2. Возможности языка:
а) вывод типов в Delphi ограничен. В YAR он более продвинут.
б) хотелось бы generics либо адаптировать, либо сделать иную реализацию. с прямой поддержкой операторов.
в)....


 
Кто б сомневался ©   (2011-02-01 16:46) [7]


> вывод типов в Delphi ограничен. В YAR он более продвинут.


Ну или присоеденится к разработке Free Pascal\Lazarus и там это реализовать (может это и есть там).


 
Кто б сомневался ©   (2011-02-01 16:48) [8]

Согласитесь, Вашими разработками (Free Pascal\Lazarus\KOL-CE) будут пользоваться тысячи - и это действительно нужно и полезно.


 
oxffff ©   (2011-02-01 16:53) [9]


> Кто б сомневался ©   (01.02.11 16:48) [8]
> Согласитесь, Вашими разработками (Free Pascal\Lazarus\KOL-
> CE) будут пользоваться тысячи - и это действительно нужно
> и полезно.


Думаете дадут просто так переписать парсер Free Pascal для некоторых вещей например LINQ?


 
oxffff ©   (2011-02-01 16:59) [10]

Код для примера на MSIL

.assembly extern mscorlib { auto }
.assembly project {}

.field public static native int ProcEx
.method public static int32 pf<T>(!!T a) cil managed
{
ldc.i4  1
ret
}
.method public static void main() cil managed
{
.entrypoint
ldftn int32 pf<int32>(!!0 a)
stsfld  native int ProcEx
ldc.i4  1
ldsfld  native int ProcEx
calli int32 (int32 a)
call void [mscorlib]System.Console::Write(int32)
ret
}


 
Кто б сомневался ©   (2011-02-01 17:18) [11]


> Думаете дадут просто так переписать парсер Free Pascal для
> некоторых вещей например LINQ?


Вы можете сделать расширенный синтаксис, который будет работать от директив.
А так вы напишите свой компилятор и язык, потратите 15 лет и он будет валяться у вас в архиве. Какой смысл? Один человек все равно не сможет его развивать и поддерживать. Это огромнейший проект.


 
Sergey Masloff   (2011-02-01 17:36) [12]

Кто б сомневался ©   (01.02.11 17:18) [11]
А на фиг его (язык самописный) развивать - человек развивает свои скилы (и правильно делает) совсем необязательно это делать в рамках проекта для практического применения (и даже наоборот - творчества больше при писании "в стол")


 
Кто б сомневался ©   (2011-02-01 18:21) [13]


> (и даже наоборот - творчества больше при писании "в стол")


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


 
И. Павел ©   (2011-02-01 18:37) [14]


> А зачем он нужен? Или это просто для практики?

Многие серьезные вещи в ИТ начинали делать в гаражах и на коленке и, скорее всего, без расчета на мегаприбыли а ради удовольствия. Поживем увидим :)


 
Кто б сомневался ©   (2011-02-01 18:56) [15]


> Многие серьезные вещи в ИТ начинали делать в гаражах и на
> коленке

И многие серьезные вещи так и остались в гаражах. Еденицы только увидели свет.


 
oxffff ©   (2011-02-01 19:58) [16]


> Кто б сомневался ©   (01.02.11 17:18) [11]
>
> > Думаете дадут просто так переписать парсер Free Pascal
> для
> > некоторых вещей например LINQ?
>
>
> Вы можете сделать расширенный синтаксис, который будет работать
> от директив.
> А так вы напишите свой компилятор и язык, потратите 15 лет
> и он будет валяться у вас в архиве. Какой смысл? Один человек
> все равно не сможет его развивать и поддерживать. Это огромнейший
> проект.


Я много не прошу. Собственно нужно из моего промежуточного представления перевести в представление LLVM.
Backend для .NET занимает 2500 cтрок.
По моим расчетам для LLVM он будет побольше, но не намного.
Я не ковырял LLVM, однако думаю что полное интанцирование параметризованных типов и методов нужно будет делать на уровне frontend в данном случае. Я могу это сделать. Сейчас весь проект занимает чуть больше 30000 строк.


 
Игорь Шевченко ©   (2011-02-01 20:11) [17]


> Многие серьезные вещи в ИТ начинали делать в гаражах и на
> коленке


умилило слово "многие". Примеры в студию,кроме Джобса и Возняка


 
И. Павел ©   (2011-02-01 20:38) [18]


> > Многие серьезные вещи в ИТ начинали делать в гаражах и
> на
> > коленке
>
>
> умилило слово "многие". Примеры в студию,кроме Джобса и
> Возняка


Говоря "cерьезные" я не имел ввиду "прибыльные". ИМХО Джобс сейчас уже скорее просто успешный коммерсант.

Многие основополагающие вещи в ИТ разрабатывали не НИИ и корпорации, а отдельные люди, даже студенты. Клод Шеннон, например, дал вторую жизнь булевой алгебре будучи студентом. Ведь в любой науке так. Корпорации нацелены на получение прибыли, и поэтому не поворачивают на те тропинки, за которыми могут скрываться настоящие золотые жилы. Просто ИТ тем и хороши, что часто позволяют экспериментировать даже без серьезных денежных вложений.


 
Leonid Troyanovsky ©   (2011-02-01 20:52) [19]


> Игорь Шевченко ©   (01.02.11 20:11) [17]

> умилило слово "многие". Примеры в студию,кроме Джобса и
> Возняка

Митник?

--
Regards, LVT.


 
KilkennyCat ©   (2011-02-01 21:05) [20]


> Игорь Шевченко ©   (01.02.11 20:11) [17]

я. и не только начинал - я там (так) и закончу :)


 
Игорь Шевченко ©   (2011-02-01 21:08) [21]

И. Павел ©   (01.02.11 20:38) [18]


> Клод Шеннон, например, дал вторую жизнь булевой алгебре
> будучи студентом.


На коленке в гараже ? Не смешно.


> Корпорации нацелены на получение прибыли, и поэтому не поворачивают
> на те тропинки, за которыми могут скрываться настоящие золотые
> жилы.


А если без пафоса ?


 
И. Павел ©   (2011-02-01 21:36) [22]


> На коленке в гараже ? Не смешно.

Конечно, он работал в Массачусетском институте, ему был 21 год и он был ассистентом-исследователем. Но занимался он там явно не внедрением булевой математики в вычислительную технику (тогда этим еще никто не мог заниматься). Это ОН увидел связь между техникой и булевой математикой. Т.е. это не результат многолетнего труда сотни штатных инженеров выполняющих четко свое ТЗ.


 
И. Павел ©   (2011-02-01 21:49) [23]

Бернерс Ли написал программу «Enquire» "Для собственных нужд" (c) википедия. Так что и всемирная паутина обязана рождением "коленке" :)


 
TUser ©   (2011-02-01 22:08) [24]


> Игорь Шевченко ©   (01.02.11 20:11) [17]
>
>
> > Многие серьезные вещи в ИТ начинали делать в гаражах и
> на
> > коленке
>
>
> умилило слово "многие". Примеры в студию,кроме Джобса и
> Возняка

паскаль, перл, пхп, mysql - изначально некомерческие проекты

перл и пхп - именно так, дай-ка сотворю что-нибудь свое, а потом оказалось, что вырастает индустрия


 
Игорь Шевченко ©   (2011-02-01 22:37) [25]


> перл и пхп - именно так, дай-ка сотворю что-нибудь свое,
>  а потом оказалось, что вырастает индустрия


не озвучен процент сотворенного своего, из которого индустрия не выросла. Без этого приведенные примеры несерьезны.

Язык С, например, тоже был придуман одним человеком и для одной цели. Но у языка С были истоки, предшественники, которым не повезло стать стандартом для индустрии. Из этого вовсе не следует, что С был сделан в гараже и на коленке, а его предшественники - по заказу корпораций, жаждущих прибылей :)


 
KilkennyCat ©   (2011-02-01 23:07) [26]

Давайте вспомним шутку линукс, и вообще то, что компы чуть ли не для бухгалтера только позиционировались, а теперь в игрушки играть можно еще.
Игорь прав, "гаражно-коленный" вариант - редкостная редкость.
В большинстве случаев имеются варианты серьезной работы серьезных людей с побочными эффектами (этой работы).


 
TUser ©   (2011-02-02 06:52) [27]


> не озвучен процент

Ну ноль, и что? Мы не можем так вот а приори не попробовав сказать - вот это будет хорошо, нужно и полезно, а то - плохо и бессмысленно. В мире людей возникает много новых штук, часть выживает.


 
oxffff ©   (2011-02-02 07:00) [28]

Помогать кто будет? или только ...
:)


 
Дмитрий С ©   (2011-02-02 07:34) [29]

Программирование ради программирования. Увлечение что ли такое?

Я бы помог с удовольствием, но не умею ничего :(


 
И. Павел ©   (2011-02-02 08:04) [30]

> [28] oxffff ©   (02.02.11 07:00)

Так мы вам в пример таких людей приводим. Чем не моральная поддержка? :)
А если серьезно: если вы работаете в ВУЗе, то, ИМХО, тут лучше умных студентов с первого курса присмотреть и самому их обучить. Организовать своего рода кружек, где заниматься разработкой нового языка. Первоначально мотивировать автоматами по экзаменам, а потом сами втянутся.


 
oxffff ©   (2011-02-02 08:57) [31]


> И. Павел ©   (02.02.11 08:04) [30]
> > [28] oxffff ©   (02.02.11 07:00)
>
> Так мы вам в пример таких людей приводим. Чем не моральная
> поддержка? :)
> А если серьезно: если вы работаете в ВУЗе, то, ИМХО, тут
> лучше умных студентов с первого курса присмотреть и самому
> их обучить


Я работал в ВУЗе пока учился в аспирантуре.
Но наши пути разошлись и слава богу. Печально такое говорить, но это так.
Однако поддерживаю связь с кафедрами.


 
oxffff ©   (2011-02-02 08:59) [32]


> тут лучше умных студентов с первого курса присмотреть и
> самому их обучить


Я не бог. Об этом пусть господин Медведев думает.
Студент закончил учиться и забыл все как страшный сон.


 
oxffff ©   (2011-02-02 09:06) [33]


> Первоначально мотивировать автоматами по экзаменам, а потом
> сами втянутся.


У меня в отделе работали студенты, мотивировать их универскими копейками я не мог.
Однако пытался мотивировать другим, охотно рассказывая и делясь своими знаниями. Но им это было не нужно. Теперь разработкой занимаются на кафедре и поэтому зав. кафедрой очень просто выписывать мотивометры ввиде сложностей в сдаче. Да и студент просто боится. Вообщем это было давно и всё такое.. :)

Рассказывал в декабре в рамках семинара в качестве гостя в предприятий на кафедрах о JAR и его устройстве. Понял только зав. кафедрой. Студенты смотрели как на новые ворота.


 
oxffff ©   (2011-02-02 09:33) [34]


> Дмитрий С ©   (02.02.11 07:34) [29]
> Программирование ради программирования. Увлечение что ли
> такое?
>
> Я бы помог с удовольствием, но не умею ничего :(


Так и я не умею всего. :)
Приходиться учится.

Собственно если бы тебе удалось разобраться как описать например функцию с 2 параметрами(функция складывает эти числа и возвращает в качестве результата), а сама программа просто вызывает эту функцию.
Я гуглил, есть русскоязычные примеры как это сделать.
То остальное дело техники.


 
oxffff ©   (2011-02-02 09:35) [35]


> Собственно если бы тебе удалось разобраться как описать
> например функцию с 2 параметрами(функция складывает эти
> числа и возвращает в качестве результата), а сама программа
> просто вызывает эту функцию.


В рамках LLVM.


 
Alkid ©   (2011-02-02 09:36) [36]

То есть YAR - это такой паскаль в блекджеком и выводом типов? :)


 
TUser ©   (2011-02-02 09:51) [37]


> Я не бог. Об этом пусть господин Медведев думает.

жжжжесть

то-то его всуе тут упоминать не дают

)))


 
oxffff ©   (2011-02-02 09:52) [38]


> Alkid ©   (02.02.11 09:36) [36]
> То есть YAR - это такой паскаль в блекджеком и выводом типов?
>  :)


Пока немного, но я быстро учусь.


 
Alkid ©   (2011-02-02 10:16) [39]


> oxffff ©   (02.02.11 09:52) [38]
> Пока немного, но я быстро учусь.

А чем был обусловлен выбор Паскаля, как отправной точки?


 
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.68 MB
Время: 0.011 c
2-1296660428
vegarulez
2011-02-02 18:27
2011.05.22
фото с вебкамеры.


3-1258970968
denis_7
2009-11-23 13:09
2011.05.22
Проблема с отчетами в Rave


2-1297332653
Oleg_teacher
2011-02-10 13:10
2011.05.22
Ограничение ввода в стринггрид действительных чисел


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


3-1259081869
Anatoly Podgoretsky
2009-11-24 19:57
2011.05.22
Явное против неявного