Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.67 MB
Время: 0.005 c
2-1297871090
Gu
2011-02-16 18:44
2011.05.22
Variant 2 String


8-1212481376
leonidus
2008-06-03 12:22
2011.05.22
Ошибка "JPEG error #41"


6-1236800865
Дмитрий Белькевич
2009-03-11 22:47
2011.05.22
Не меняется порт в TIdSyslogServer (или скорее TIdUDPServer)


1-1254906944
Aleks
2009-10-07 13:15
2011.05.22
Как вычислить матем.значение в Edit?


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский