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

Вниз

Лисп   Найти похожие ветки 

 
Palladin ©   (2008-05-05 17:42) [80]


> ПостОвый терминатор ©   (05.05.08 17:38) [79]

А ведь кто-то, буквально ~8 минут назад, флуданул в другой ветке. Не будем показывать пальцами, но это был слоненок.


 
Игорь Шевченко ©   (2008-05-05 17:44) [81]

ПостОвый терминатор ©   (05.05.08 17:38) [79]

А зачем ты в начинающих пишешь под чужими никами ? Накажу.


 
ПостОвый терминатор ©   (2008-05-05 17:47) [82]


> Игорь Шевченко ©   (05.05.08 17:44) [81]

Не понял, а каком посте идет речь?


 
Пробегал2...   (2008-05-05 18:50) [83]

Игорь Шевченко ©   (05.05.08 15:33) [46]
прежде чем спорить, про предмет спора почитай малость


а я ни с чем не спорил. Перечитываем дружно два раза.


 
oxffff ©   (2008-05-05 20:40) [84]

Итак приступим


> Григорьев Антон ©   (05.05.08 16:36) [70]
>
> > oxffff ©   (05.05.08 15:48) [52]
> > type
> > TXFUNC=function (const a:TvarRec):TvarRec;
> >
> > function abc(var List:array of const;func:TXFUNC):integer;
>
> >
> > var i:integer;
> > begin
> > for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]);
> > end;
> >
> > function XSample(const a:TvarRec):TvarRec;
> > begin
> >
> > end;
> >
> > procedure TForm1.Button1Click(Sender: TObject);
> > var a:array of TVarRec;
> > begin
> > abc(A,XSample);
> > end;
>
> Не компилируется abc([1,"a", 2], XSample), т.е. константный
> список кушать не хочет. В Лиспе с этим проблем нет. Я уж
> молчу о том, что чтобы правильно сформировать содержимое
> массива a, надо будет повозиться с полями TVarRec, что очень
> неудобно. Полиморфизм функции XSample тоже не так просто
> сделать.


А разве должно?
function abc(var )

Однако кто вам мешает сделать так?

type
TXFUNC=function (const a:TvarRec):TvarRec;
VarRecArray=array of TVarRec;

function abc(var List:array of const;func:TXFUNC):integer;
var i:integer;
begin
for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]);
end;

function XSample(const a:TvarRec):TvarRec;
begin

end;

function TrickInit(const List:array of const):VarRecArray;
begin
Setlength(result,length(list));
copyMemory(result,@list,sizeof(TvarRec)*length(List));
end;


procedure TForm1.Button1Click(Sender: TObject);
var A:VarRecArray;
begin
A:=TrickInit([1,"2",3,4]);
abc(A,XSample);
end;


 
oxffff ©   (2008-05-05 20:58) [85]

Продолжим.


> Григорьев Антон ©   (05.05.08 16:36) [70]
> oxffff ©   (05.05.08 15:50) [54]
> Как у вас с ООП?
> Видимо, очень плохо. Потому что не представляю, при чём
> вообще ООП, когда я хочу выполнить простые операции над
> типами integer, real, char и т.п.


Идея состоит в том, что вы создаете иерархию классов оберток для типов в том числе и для элементарных. И определяете унарные операции над типом ввиде например интерфейсов, виртуальных методов, или published методов, т.е. все с поздним связыванием.

Используя аналогичную идею как с TCustomvariant


 
Игорь Шевченко ©   (2008-05-05 21:06) [86]

Пробегал2...   (05.05.08 18:50) [83]

Эт ты сказки рассказывай где-нибудь еще. Ты тут личность давно известная, повадки твои тоже. Так еще раз - прежде чем спорить, изучи предмет спора.


 
oxffff ©   (2008-05-05 21:07) [87]


> Григорьев Антон ©   (05.05.08 16:36) [70]
>
> Да, читали. Но TCustomVariant - это всё-таки не элементарный
> тип, а обеспечивать полиморфизм на уровне простых типов
> Delphi не умеет.
>
> Получил ожидаемый результат - исключение в строке с синусом.
>  Потому что такие фокусы проходят только когда v содержит
> указатель на IDispatch, т.е. простые типы опять пролетают
> как фанера над Парижем. Ответ насчёт стандартной функции
> sin не засчитывается.


Это вам задание на дом, а именно как прикрутить disp вызовы к элементарным типам. Подумайте.


 
oxffff ©   (2008-05-05 21:15) [88]


> Игорь Шевченко ©   (05.05.08 16:42) [72]
> oxffff ©   (05.05.08 16:20) [67]
>
> Мне будет крайне интересна передача классов в иерархии через
> TVarRec
>
> type
>  TFooBase = class
>  public
>     procedure SomeMethod (Param: TParam); virtual;
>  end;
>
>  TFoo = class(TFooBase)
>  ...
>  end;
>  TBar = class(TFoo)
>  ...
>  public
>     procedure SomeMethod (Param: TParam); override;
>  end;
>
> То есть, при generic-ах я могу написать
>
>  type
>    TFooList = TList<TFoobase>
>    public
>     ...
>      procedure ApplySomeMethod (Param: TParam);
>    end;
>
> procedure TFooList.ApplySomeMethod (Param: TParam);
> var
>  I: Integer;
> begin
>  for I:=0 to Count-1 do
>    Items[I].SomeMethod (Param);
> end;


Я не понял вашего вопроса?


 
Grids   (2008-05-05 21:31) [89]


> ПостОвый терминатор ©   (05.05.08 17:38) [79]
> Господа, заинтересованные! Извините еще в очередной раз.
>  Позвольте спросить, что Вам мешает открыть соответствующую
> (новую) обсуждению ветку? А не флудить в ветке автора, которого
> ваша "переписка" похоже не интересует:(

Мне показалось, что меня не поняли:(
Или на самом деле на этом форуме все ...
Еще раз прошу извинить за резкость (просто становится обидно за форум)


 
Григорьев Антон ©   (2008-05-05 22:12) [90]


> oxffff ©   (05.05.08 20:40) [84]
> Однако кто вам мешает сделать так?
<...>
procedure TForm1.Button1Click(Sender: TObject);
var A:VarRecArray;
begin
A:=TrickInit([1,"2",3,4]);
abc(A,XSample);
end;

А если понадобится так?
procedure TForm1.Button1Click(Sender: TObject);
var A:VarRecArray;
begin
A:=TrickInit([1,"abc",3,4]);
abc(A,XSample);
end;
Будете использовать CopyMemory с автоматически финализируемым типом?


 
oxffff ©   (2008-05-05 22:34) [91]


> Будете использовать CopyMemory с автоматически финализируемым
> типом?


А может изучить мат. часть?

 TVarRec = record { do not pack this record; it is compiler-generated }
   case Byte of
     vtInteger:    (VInteger: Integer; VType: Byte);
     vtBoolean:    (VBoolean: Boolean);
     vtChar:       (VChar: Char);
     vtExtended:   (VExtended: PExtended);
     vtString:     (VString: PShortString);
     vtPointer:    (VPointer: Pointer);
     vtPChar:      (VPChar: PChar);
     vtObject:     (VObject: TObject);
     vtClass:      (VClass: TClass);
     vtWideChar:   (VWideChar: WideChar);
     vtPWideChar:  (VPWideChar: PWideChar);
     vtAnsiString: (VAnsiString: Pointer);
     vtCurrency:   (VCurrency: PCurrency);
     vtVariant:    (VVariant: PVariant);
     vtInterface:  (VInterface: Pointer);
     vtWideString: (VWideString: Pointer);
     vtInt64:      (VInt64: PInt64);
 end;


 
oxffff ©   (2008-05-05 22:36) [92]


> oxffff ©   (05.05.08 22:34) [91]
>
> > Будете использовать CopyMemory с автоматически финализируемым
>
> > типом?
>
>
> А может изучить мат. часть?
>
>  TVarRec = record { do not pack this record; it is compiler-
> generated }
>    case Byte of
>      vtInteger:    (VInteger: Integer; VType: Byte);
>      vtBoolean:    (VBoolean: Boolean);
>      vtChar:       (VChar: Char);
>      vtExtended:   (VExtended: PExtended);
>      vtString:     (VString: PShortString);
>      vtPointer:    (VPointer: Pointer);
>      vtPChar:      (VPChar: PChar);
>      vtObject:     (VObject: TObject);
>      vtClass:      (VClass: TClass);
>      vtWideChar:   (VWideChar: WideChar);
>      vtPWideChar:  (VPWideChar: PWideChar);
>      vtAnsiString: (VAnsiString: Pointer);
>      vtCurrency:   (VCurrency: PCurrency);
>      vtVariant:    (VVariant: PVariant);
>      vtInterface:  (VInterface: Pointer);
>      vtWideString: (VWideString: Pointer);
>      vtInt64:      (VInt64: PInt64);
>  end;


 
Игорь Шевченко ©   (2008-05-05 23:37) [93]

oxffff ©   (05.05.08 21:15) [88]


> Я не понял вашего вопроса?


Есть иерархия. Она описана. Есть шаблонный класс списка классов из этой иерархии. Я описал гипотетический пример, как класс списка мог бы выглядеть с применением generic-ов, и как это выглядит в C# и С++
насколько я понял, ты предлагаешь реализовать функциональность generic-ов через TVarRec
Вот мне и любопытно увидеть реализацию моего гипотетического примера с помощью TVarRec


 
Ketmar ©   (2008-05-06 01:09) [94]

а можно я скажу, можно? привет, придурки!

Игорь, Розыч — ну не удаляйте. разве я не прав?

зыж для остальных: Кэтмар — ламер. это общеизвестный факт.


 
oxffff ©   (2008-05-06 09:05) [95]


> Игорь Шевченко ©   (05.05.08 23:37) [93]
> oxffff ©   (05.05.08 21:15) [88]
>
>
> > Я не понял вашего вопроса?
>
>
> Есть иерархия. Она описана. Есть шаблонный класс списка
> классов из этой иерархии. Я описал гипотетический пример,
>  как класс списка мог бы выглядеть с применением generic-
> ов, и как это выглядит в C# и С++
> насколько я понял, ты предлагаешь реализовать функциональность
> generic-ов через TVarRec
> Вот мне и любопытно увидеть реализацию моего гипотетического
> примера с помощью TVarRec


вопрос был про TYPE ANY (шаблонные) функции.


 
Polevi   (2008-05-06 09:27) [96]

>oxffff ©   (06.05.08 09:05) [95]
многое можно сделать через ж
но не нужно


 
Григорьев Антон ©   (2008-05-06 09:34) [97]


> oxffff ©   (05.05.08 22:34) [91]
> А может изучить мат. часть?

Учите. Вам знаний матчасти как раз очень не хватает.

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

type
 TXFUNC=function (const a:TvarRec):TvarRec;
 VarRecArray=array of TVarRec;

function abc(var List:array of const;func:TXFUNC):integer;
var
 i:integer;
begin
 for i:=0 to length(List)-1 do
   LIST[i]:=func(LIST[i]);
 Result:=0;
end;

function XSample(const a:TvarRec):TvarRec;
begin
 Result:=a;
end;

function TrickInit(const List:array of const):VarRecArray;
begin
 Setlength(result,length(list));
 copyMemory(result,@list,sizeof(TvarRec)*length(List));
end;

procedure TForm1.Button1Click(Sender: TObject);
var A:VarRecArray;
   S:string;
begin
 S:="abc";
 UniqueString(S);
 A:=TrickInit([S]);
 S:="123";  {*}
 abc(A,XSample);
 ASSERT(A[0].VType = vtAnsiString);
 Label1.Caption:=string(A[0].VAnsiString)
end;


Функция XSample оставляет переданное ей значение без изменения, поэтому следует ожидать появления в Label1 текста "abc", который был присвоен переменной S, переданной затем в качестве элемента массива. Тем не менее, на экране появляется непонятно что (проверено в Delphi 7). А вот если убрать строку, отмеченную звёздочкой, будет, как и ожидалось, строка "abc".

Поясню, что здесь происходит. С помощью UniqueString мы добиваемся того, что значение S хранится в динамической памяти со счётчиком ссылок, равным 1. Когда мы передаём это значение в конструктор открытого вариантного массива, указатель на эту строку тупо копируется как простой указатель, который и сохраняется в нулевом элементе массива A. Механизм подсчёта ссылок при этом не включается. И когда переменной S присваивается другое значение, память, занимаемая строкой, считается свободной, и что там будет располагаться - это как повезёт. А в A[0] при этом сохраняется этот битый указатель, в результате чего мы и имеем проблемы. Кстати, рекомендую попробовать после строки со звёздочкой вставить UniqueString(S) - увидите ещё один интересный эффект :))

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

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

Конечно, можно в вашу функцию TrickInit добавить контроль за счётчиком ссылок или вообще преобразование, сводящее всё к PChar и ручному управлению памятью. Потребуется ещё куча функций, которые будут в разных ситуациях отвечать за правильное освобождение памяти в нужный момент. Но удобно ли будет пользоваться такой библиотекой с такими наворотами? Да ещё и с учётом того, что для работы с ней подходит не любой тип данных, а специально организованный, и не любая функция, а только специально написанная? Предлагаю вам остановится на таком завершении спора: "В Delphi, сильно извратившись, можно написать библиотеку, которая, при добровольном соблюдении её пользователем кучи ограничений, позволит ему программировать в стиле, похожем на Лисп. Но для решения любой практической задачи будет удобнее писать в стиле Delphi, чем использовать такую библиотеку".


 
euru ©   (2008-05-06 09:34) [98]


> Alkid ©   (05.05.08 17:22) [76]
> А на ABAP как mapcar написать? :)))


Например, можно так:

form mapcar
    using    in_table  type index table
             func_name type string
    changing out_table type index table
.
field-symbols: <in>, <out>.

  clear out_table.
  loop at in_table assigning <in>.
    append initial line to out_table assigning <out>.
    perform (func_name) in program (sy-cprog)
        using    <in>
        changing <out>
    .
  endloop.
endform.


 
Игорь Шевченко ©   (2008-05-06 09:35) [99]

oxffff ©   (06.05.08 09:05) [95]


> вопрос был про TYPE ANY (шаблонные) функции.


Переведи пожалуйста, я не понял ответа


 
oxffff ©   (2008-05-06 09:49) [100]


> Григорьев Антон ©   (06.05.08 09:34) [97]
>
> > oxffff ©   (05.05.08 22:34) [91]
> > А может изучить мат. часть?
>
> Учите. Вам знаний матчасти как раз очень не хватает.


Ну. ну. Может вы все же удостоверитесь и откроете отладчик. И посмотрите на код который генерирует компилятор?

И прежде чем мне приводить примеры все же изучите мат. часть.


 
oxffff ©   (2008-05-06 10:04) [101]


> Григорьев Антон ©   (06.05.08 09:34) [97]
>
> > oxffff ©   (05.05.08 22:34) [91]
> > А может изучить мат. часть?
>
> Учите. Вам знаний матчасти как раз очень не хватает.
>
> Берём ваш код и слегка дополняем, чтобы можно было получить
> какой-то результат.
>
> type
>  TXFUNC=function (const a:TvarRec):TvarRec;
>  VarRecArray=array of TVarRec;
>
> function abc(var List:array of const;func:TXFUNC):integer;
>
> var
>  i:integer;
> begin
>  for i:=0 to length(List)-1 do
>    LIST[i]:=func(LIST[i]);
>  Result:=0;
> end;
>
> function XSample(const a:TvarRec):TvarRec;
> begin
>  Result:=a;
> end;
>
> function TrickInit(const List:array of const):VarRecArray;
>
> begin
>  Setlength(result,length(list));
>  copyMemory(result,@list,sizeof(TvarRec)*length(List));
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> var A:VarRecArray;
>    S:string;
> begin
>  S:="abc";
>  UniqueString(S);
>  A:=TrickInit([S]);
>  S:="123";  {*}
>  abc(A,XSample);
>  ASSERT(A[0].VType = vtAnsiString);
>  Label1.Caption:=string(A[0].VAnsiString)
> end;
>
> Функция XSample оставляет переданное ей значение без изменения,
>  поэтому следует ожидать появления в Label1 текста "abc",
>  который был присвоен переменной S, переданной затем в качестве
> элемента массива. Тем не менее, на экране появляется непонятно
> что (проверено в Delphi 7). А вот если убрать строку, отмеченную
> звёздочкой, будет, как и ожидалось, строка "abc".

А что вы хотите, если вы не знаете работу с типом TvarRec.
И даже не удосужились не только открыть отладчик, но и внимательно посмотреть [92].

И copyMemory(result,@list,sizeof(TvarRec)*length(List)) не имеет к этому никакого отношения.

Тип TvarRec не имеет и иметь не может финализируемых типов.
Поэтому семантика копирования простая без использования TypeInfo.

>
> Поясню, что здесь происходит. С помощью UniqueString мы
> добиваемся того, что значение S хранится в динамической
> памяти со счётчиком ссылок, равным 1. Когда мы передаём
> это значение в конструктор открытого вариантного массива,
>  указатель на эту строку тупо копируется как простой указатель,

Это говорит о вашем не знании.
Код создания массива создает компилятор.
А то что вы не знаете некоторых нюансов налицо.

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

var a,b:Tvarrec;

a:=b;    

Ничего подобного.

Финализируемые типы в вариантных записях запрещены. :)
Поэтому будет простое копирование. :)

>  который и сохраняется в нулевом элементе массива A. Механизм
> подсчёта ссылок при этом не включается. И когда переменной
> S присваивается другое значение, память, занимаемая строкой,
>  считается свободной, и что там будет располагаться - это
> как повезёт. А в A[0] при этом сохраняется этот битый указатель,
>  в результате чего мы и имеем проблемы. Кстати, рекомендую
> попробовать после строки со звёздочкой вставить UniqueString(S)
> - увидите ещё один интересный эффект :))

Проблемы в том, что вы не понимаете что вы делаете. И что делает компилятор. :)

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

Я все ваши вопросы ответил. См. внимательно. :)

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

Ну и кто теперь опять не прав? :)

>
>
> Конечно, можно в вашу функцию TrickInit добавить контроль
> за счётчиком ссылок или вообще преобразование, сводящее
> всё к PChar и ручному управлению памятью.

Это требуется от вас поскольку приведение делает компилятор и вы должны это знать.  :)

Потребуется ещё
> куча функций, которые будут в разных ситуациях отвечать
> за правильное освобождение памяти в нужный момент. Но удобно
> ли будет пользоваться такой библиотекой с такими наворотами?
>  Да ещё и с учётом того, что для работы с ней подходит не
> любой тип данных, а специально организованный, и не любая
> функция, а только специально написанная? Предлагаю вам остановится
> на таком завершении спора: "В Delphi, сильно извратившись,
>  можно написать библиотеку, которая, при добровольном соблюдении
> её пользователем кучи ограничений, позволит ему программировать
> в стиле, похожем на Лисп. Но для решения любой практической
> задачи будет удобнее писать в стиле Delphi, чем использовать
> такую библиотеку".


C уважением Антонов Сергей. :)


 
Григорьев Антон ©   (2008-05-06 10:05) [102]


> oxffff ©   (06.05.08 09:49) [100]
> Ну. ну. Может вы все же удостоверитесь и откроете отладчик.
>  И посмотрите на код который генерирует компилятор?

Дык, смотрел ведь :) Копирование указателя увидел, изменения счётчика ссылок - нет. Да и результат работы этого кода говорит сам за себя. Или неизвестно какое значение - это то, что вы хотели получить с самого начала?

А примеры кода приводите вы. Я привожу примеры того, когда ваше решение работает неправильно.


 
oxffff ©   (2008-05-06 10:10) [103]


> euru ©   (06.05.08 09:34) [98]
>
> > Alkid ©   (05.05.08 17:22) [76]
> > А на ABAP как mapcar написать? :)))
>
>
> Например, можно так:
>
> form mapcar
>     using    in_table  type index table
>              func_name type string
>     changing out_table type index table
> .
> field-symbols: <in>, <out>.
>
>   clear out_table.
>   loop at in_table assigning <in>.
>     append initial line to out_table assigning <out>.
>     perform (func_name) in program (sy-cprog)
>         using    <in>
>         changing <out>
>     .
>   endloop.
> endform.


Спасибо за пример.
Мне тоже нравится понятие field-symbols
(которые по сути являются typed ref) на ABAP.


 
oxffff ©   (2008-05-06 10:18) [104]


> А примеры кода приводите вы. Я привожу примеры того, когда
> ваше решение работает неправильно.


Решение правильное. Нужно знать работу компилятора с TvarRec.

Проблема не в коде TrickInit (и кокретно не в CopyMemory).
а в том, что TVarrec являясь вариантной записью не может содержать финализируемые типы.
И разработчики Delphi не написали Compiler magic функций которые обрабатывают семантику этого типа.
В отличии от variant.

Проблема в том что компилятор при приведении делает это грубо, а именно в строке
A:=TrickInit([S]);

Посмотрите внимательно. Что будет при передаче по значению
function abc(List:array of const);
Будет простое копирование на стек. Никакой обработки Vtype в отличии от variant


 
oxffff ©   (2008-05-06 10:20) [105]


> Дык, смотрел ведь :) Копирование указателя увидел, изменения
> счётчика ссылок - нет.

Так устроен Delphi. И на это вы натыкатесь еще до входа в функцию TrickInit. :)


 
Григорьев Антон ©   (2008-05-06 10:21) [106]


> oxffff ©   (06.05.08 10:04) [101]
> Тип TvarRec не имеет и иметь не может финализируемых типов.

Напомню, что именно это я с самого начала и сказал, когда писал, что ваше решение на основе TVarRec ограничено и поэтому не может работать с финализируемыми типами, поэтому мы имеем большие ограничения на работу со строками. В отличие от Лиспа, в котором таких проблем не возникает. Если бы вы сразу признали это, не о чем было бы говорить.

> Это говорит о вашем не знании.
> Код создания массива создает компилятор.
> А то что вы не знаете некоторых нюансов налицо.
>
> Вы наверно думаете, что если вы напишите то будет использован
> механиазм копирования typeinfo.
>
> var a,b:Tvarrec;
>
> a:=b;    
>
> Ничего подобного.

Как раз этого я не думаю. Как копируются записи, я знаю. Откуда вы взяли, что я так думаю - это ваши проблемы.

> Проблемы в том, что вы не понимаете что вы делаете. И что
> делает компилятор. :)

Голословное утверждение. Я подробно описал, что, на мой взгляд, делает компилятор. Если я где-то допустил ошибку, укажите, где именно.

> Ну и кто теперь опять не прав? :)

Вы. Потому что вы привели код, позиционируя его как эквивалент Лиспа и не указав дополнительных ограничений. А он эквивалентом не является, так как не умеет работать со строками.


 
oxffff ©   (2008-05-06 10:25) [107]

to Григорьев Антон ©  

Вот пример.

function abc2(list:array of const):integer;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
abc2([1,2,"asd","asdasd"]);
end;

cм. копирование в теле abc2 при создании копии.
Анализа на Vtype нет, а отличие от variant (у которых есть compiler magic).
Такова семантика TvarRec.


 
Григорьев Антон ©   (2008-05-06 10:26) [108]


> oxffff ©   (06.05.08 10:18) [104]
> Решение правильное. Нужно знать работу компилятора с TvarRec.

Правильное решение - это то, для которого чётко указаны границы применимости. Вы ничего не написали про ограничения на работу со строками - откуда я мог знать, понимаете ли вы, что ваш пример с ними работать не будет, или нет. Вот и написал, что не будет.

> Посмотрите внимательно. Что будет при передаче по значению
>
> function abc(List:array of const);
> Будет простое копирование на стек. Никакой обработки Vtype
> в отличии от variant

А я как сказал? o_O

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

Теперь выдохните, подумайте и напишите, в чём именно вы хотите меня убедить.


 
oxffff ©   (2008-05-06 10:45) [109]


> Григорьев Антон ©   (06.05.08 10:26) [108]
>
> > oxffff ©   (06.05.08 10:18) [104]
> > Решение правильное. Нужно знать работу компилятора с TvarRec.
>
>
> Правильное решение - это то, для которого чётко указаны
> границы применимости. Вы ничего не написали про ограничения
> на работу со строками - откуда я мог знать, понимаете ли
> вы, что ваш пример с ними работать не будет, или нет. Вот
> и написал, что не будет.

Мой пример будет работать, если вы знаете как устроен Delphi.

Почему вы пытаетесь обвинить меня в том, как устроен TvarRec.
И более того пытались мне вменить ошибку с CopyMemory (см )

Напоминаю вам ваш пост

Григорьев Антон ©   (05.05.08 22:12) [90]
Будете использовать CopyMemory с автоматически финализируемым типом?


TvarRec - имеет простую семантику копирования.

Поэтому ситуацию которые вы смоделировали относится к TvarRec, а не к моей реализации.

>
> > Посмотрите внимательно. Что будет при передаче по значению
>
> >
> > function abc(List:array of const);
> > Будет простое копирование на стек. Никакой обработки Vtype
>
> > в отличии от variant
>
> А я как сказал? o_O
>
> Я так и писал, что будет простое копирование (точнее, я
> назвал его не простым, а тупым, но сути это не меняет).

А зачем был ваш вопрос про CopyMemory?  :)

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

Вы сначала пытались прицепится к CopyMemory. А потом когда я вам популярно объяснил, что TvarRec не автоматически финализируемый пытались мне вменить свое незнание.  :)

>
> Теперь выдохните, подумайте и напишите, в чём именно вы
> хотите меня убедить.


Я вам написал три варианта решения.

Кстати как там ваше домашнее задание? см. выше


 
Alkid ©   (2008-05-06 10:48) [110]


> oxffff ©   (06.05.08 09:05) [95]

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

Суть в том, что во всех этих примерах ты делашь примерно следующее:  реализуешь своими силами на уровне библиотеки то, что в Лиспе есть по дефолту, на уровне языка. Смотри, сколько ты понаписал для одной функции mapcar, которая есть только один конкретный пример функции высшего порядка, не самый сложный, кстати. И ладно бы ты эту тонну кода понаписал, а пользователь мог бы просто и изящно ей пользоваться. Так нет же, надо ещё свох обёрток понаписать для функций.

Я всё это к чему веду - есть такие вещи, которые должны быть либо поддержаны на уровне самого языка, либо должны быть выброшены и стоит программировать без них. Функции высшего порядка в общем виде, например.
Не потому, что из невозможно промоделировать, а потому что полученное решение не будет иметь production quality.

В качестве примера из реальной жизни расскажу, как у нас в конторе некоторые сетлые умы решили забацать свой сборщик мусора для С++. Он даже работал. Но для корректной работы с ним надо было прекрасно разбираться в целом зоопарке смартпоинтеров, изобретённых для его поддержки. А если кто-то где-то ошибался, то вся система нагибалась разом, причём очень трудно было обнаружить, кто и где неправильно что сделал. А программистов много, приходят новые. Кто-то и где-то обязательно налажает.
А ведь сборщик мусора - это один из базовых сервисов платформы, о котором не надо особо задумываться. Понятно, что он не должен усложнять программирование и служить источником ошибок.

Так же и тут. Реализовывать функции высшего порядка или хотя бы mapcar в общем виде на Delphi смысла нет, овчинка не стоит выделки. Будет как с тем сборщиком мусора - да, они это сделали, но потом требовалось такое количество магических пассов и приседаний, что бы с ним правильно работать, что лучше было бы ограничиться гораздо более простым и специализированным решением.


 
oxffff ©   (2008-05-06 10:57) [111]


> Alkid ©   (06.05.08 10:48) [110]


Никто не спорит.

Было утверждение, что нельзя. Я показываю как можно.
То что это костыли никто не спорит. Да это костыли.
Но ходить худо бедно можно.  :)


 
31512   (2008-05-06 11:00) [112]


> oxffff ©   (06.05.08 10:57) [111]

- Доктор! У меня заворот кишок!
- Ничего страшного! Проглотите вот эту палочку.


 
Игорь Шевченко ©   (2008-05-06 11:01) [113]

Вот в паскале есть тип string, в C (и в С++) его нету. Много лет разные умы с разной степенью успеха измышляли различные способы работы со строками, подобные работе с ними же в паскале.

И все равно, на обложке издания написано "Британская энциклопудия", то есть, работать так, как в паскале, не получается.

Это я к тому, что работа со строками прекрасно переводится на язык команд процессора.


 
Alkid ©   (2008-05-06 11:08) [114]


> Было утверждение, что нельзя. Я показываю как можно.

Не совсем. Цитирую:

> вы хотите сказать, что на дельфи этого сделать невозможно?
>  не понимаю.

В рамках такой общности, как в Лисп - нет.


То, что ты предложил по общности не дотягивает. Это всё же более специальный случай, ибо не на все функции применим, а только на те, которые TVarRec принимают :)


 
Alkid ©   (2008-05-06 11:15) [115]


> Вот в паскале есть тип string, в C (и в С++) его нету. Много
> лет разные умы с разной степенью успеха измышляли различные
> способы работы со строками, подобные работе с ними же в
> паскале.
>
> И все равно, на обложке издания написано "Британская энциклопудия",
>  то есть, работать так, как в паскале, не получается.
>
> Это я к тому, что работа со строками прекрасно переводится
> на язык команд процессора.

Кстати да. Те же яйца, но меньше. Как ты ни бейся, а сделать так, что бы выражение "bla-bla-bla" + "bu-bu-bu" на С++ занималось конкатенацией строк, а не сложением указателей, не выйдет.


 
oxffff ©   (2008-05-06 11:23) [116]


> Alkid ©   (06.05.08 11:08) [114]
>
> > Было утверждение, что нельзя. Я показываю как можно.
>
> Не совсем. Цитирую:
>
> > вы хотите сказать, что на дельфи этого сделать невозможно?
>
> >  не понимаю.
>
> В рамках такой общности, как в Лисп - нет.
>
> То, что ты предложил по общности не дотягивает. Это всё
> же более специальный случай, ибо не на все функции применим,
>  а только на те, которые  принимают :)


Вариант на TVarRec самый простой и менее гибкий.
Я кстати еще написал 2 варианта решения.
Например на variant, работу с которым можно расширить посредством новых типов используя TcustomVariant.


 
Игорь Шевченко ©   (2008-05-06 11:25) [117]


> Я кстати еще написал 2 варианта решения.
> Например на variant, работу с которым можно расширить посредством
> новых типов используя TcustomVariant.


а свой вариант с иерархией я увижу ?


 
crux   (2008-05-06 11:26) [118]

Игорь Шевченко ©   (06.05.08 11:01) [113]

Вы немного искажаете действительность. Как вам должно быть прекрасно известно, в стандартной (sic!) библиотеке С++ есть тип string, предоставляющий все необходимые абстракции, которые позволяют обращаться со строками как со встроенным типом. Кроме того, интерфейс строк включает в себя интерфейс вектора из той же стандартной библиотеки.
А вот интересно, есть ли в паскале стандартная возможность конкатенации строк, посредством добавления в конец (append), позволяющая добиться линейной сложности в этом деле?


 
Игорь Шевченко ©   (2008-05-06 11:33) [119]

crux   (06.05.08 11:26) [118]


> Вы немного искажаете действительность. Как вам должно быть
> прекрасно известно, в стандартной (sic!) библиотеке С++
> есть тип string, предоставляющий все необходимые абстракции,
>  которые позволяют обращаться со строками как со встроенным
> типом


то есть, я могу написать
string foo;

foo = "foo" + "bar";

?


 
Григорьев Антон ©   (2008-05-06 11:37) [120]


> oxffff ©   (06.05.08 10:45) [109]
> Мой пример будет работать, если вы знаете как устроен Delphi.

Правда будет? "Будет работать" в контексте нашей беседы означает "будет работать как в Лиспе". В Лиспе можно работать со строками. Ваш пример, в котором вы используете CopyMemory, со строками работать не может. Следовательно, как в Лиспе он работать не будет.

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

> Почему вы пытаетесь обвинить меня в том, как устроен TvarRec.

Извините, но это ваши фантазии. Я вас в этом не обвинял.

> И более того пытались мне вменить ошибку с CopyMemory (см
> )
>
> Напоминаю вам ваш пост
>
> Григорьев Антон ©   (05.05.08 22:12) [90]
> Будете использовать CopyMemory с автоматически финализируемым
> типом?
>
> TvarRec - имеет простую семантику копирования.
>
> Поэтому ситуацию которые вы смоделировали относится к TvarRec,
>  а не к моей реализации.

Снова разжёвываю по буквам. Чтобы вам было понятно, в чём именно я вас обвиняю. Нумерую свои утверждения, чтобы вам легче было указать, какое из них конкретно кажется вам неправильным.

1. Конструктор открытого вариантного массива позволяет передавать строки в качестве элементов массива. Строки при этом трактуются как AnsiString.

2. При передаче элементов открытого вариантного массива через стек элементы финализируемых типов просто копируются как указатели, механизм подсчёта ссылок при этом не задействется.

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

4. Время жизни результата, который возвращает ваша функция TrickInit, в общем случае непредсказуемо и может быть существенно больше, чем время жизни элементов массива.

5. Простое копирование ссылок на финализируемые данные с помощью CopyMemory или иным подобным способом в тех случаях, когда нет гарантии, что копия не переживёт оригинал - абсолютно безграмотное действие. Именно это я и хотел сказать с самого начала.

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

Вот, собственно, какие именно у меня претензии к вашему коду.

> Вы сначала пытались прицепится к CopyMemory. А потом когда
> я вам популярно объяснил, что TvarRec не автоматически финализируемый
> пытались мне вменить свое незнание.  :)

Я не утверждал, что TVarRec финализируемый. Я утверждал (и продолжаю утверждать), что в вашем случае ссылка на финализируемые данные может попасть в TVarRec и не будет учтена при подсчёте ссылок, а вы ничего не сделали, чтобы предотвратить это. Всё остальное - ваши личные фантазии, за которые я не могу нести ответственности.

> Я вам написал три варианта решения.
>
> Кстати как там ваше домашнее задание? см. выше

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

Далее, я вам с самого начала сказал, что "как в Лиспе" - это работа с простыми типами без всяких обёрток, поэтому ООП и TCustomVariant здесь не при чём - они не отвечают начальному условию задачи. Если вы этого до сих пор не поняли, то я тоже не могу нести за это ответственности. Что касается третьего варианта (точнее, первого в хронлогическом порядке), то он не умеет работать со строками. Так что вы пока не предложили ни одного решения, которое было бы сравнимо по общности с Лиспом. А вовсе не три, как вы здесь пишете.



Страницы: 1 2 3 4 5 6 вся ветка

Форум: "Прочее";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.78 MB
Время: 0.066 c
1-1195055685
NX
2007-11-14 18:54
2008.06.22
Обработка сообщений в сервисе


15-1210621638
antonn
2008-05-12 23:47
2008.06.22
AD (LDAP) на WinXP


15-1210230201
koha
2008-05-08 11:03
2008.06.22
Можно ли найти работу программистом без вышки?


3-1200900133
MZ
2008-01-21 10:22
2008.06.22
Тип данных в Firebird


2-1212041779
Smile
2008-05-29 10:16
2008.06.22
TFooClass





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