Re[30]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 08:24
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> Ну в итоге то с ограничениями чем от дженериков отличается?


R>Ограниченный дженерик ничем отличаться не будет, кроме того, что инстанциация его происходит в компайлтайм.

Для AOT тоже в компайлтайм.
S>> R>Дженерики это прежде всего типобезопасность. А ителисенс, еще раз, не характеристика языка.

S>> Это характеристика языка! Так как можно выводить тип итд.


R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.

Ну и нахрен такой язык нужен если нет нормального среды разработки.
Еще раз напомню про Delphi. Это не только язык, но и среда разработки.
S>> С++ ники очень любили блокнот. Хотя он типизированный. Но макросы и шаблоны этому сильно препятствовали.
и солнце б утром не вставало, когда бы не было меня
Re[31]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 08:45
Оценка: 1 (1)
Здравствуйте, Serginio1, Вы писали:

S> R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.


S> Ну и нахрен такой язык нужен если нет нормального среды разработки.


Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.

S> Еще раз напомню про Delphi. Это не только язык, но и среда разработки.


Так в Delphi он тоже не работает для дженериков
avalon/3.0.2
Re: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:10
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>c# .net 8 rc1

Р>
Р>AOT analysis warning IL3050: Program.<>c.<<Main>b__2_0>d.MoveNext(): Using member 'System.Text.Json.JsonSerializer.Deserialize<Payload>(String,JsonSerializerOptions)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.
Р>

Р>И так рефлексию на свалку, гоу на кодогенерацию(zig, ++, dlang смотрят на это все с ухмылкой)!
Современные тренды именно такие. Компиляторы за 20 лет сильно подросли.

Р>Зашибись конечно.

Р>Те использование аот это бег по минному полю. понимаю...
Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти

Р>Все таки получается попытка превратить ограниченный яп(часть) в Common Lisp(целое) не лучшая идея.

Вообще непонятно что ты хочешь сказать

Р>В итоге получаем с одной стороны:

Р>oberon который имеет минимум языковых конструкции но полностью отражает возможности железа.
Р>с другой:
Р>Common Lisp позволяющий делать все что придет в голову программисту.
Как это связано с AOT в .NET ?

Р>Все остальное вариации на этой шкале.

Интересное упрощение, но нет

Р>тот же null как false в js это же из лиспа пошло.

А не из C?
Re[2]: Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 23.09.23 10:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

Р>>Зашибись конечно.

Р>>Те использование аот это бег по минному полю. понимаю...
G>Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти
предупреждения это же не точно, такое себе как обойти. точно разве нельзя вычислить по АСТ?


Р>>тот же null как false в js это же из лиспа пошло.

G>А не из C?
на конфе слышал про цитату что js это лисп для браузера. отсюда и вывод.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[32]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 10:18
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.


S>> Ну и нахрен такой язык нужен если нет нормального среды разработки.


R>Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.

Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.
S>> Еще раз напомню про Delphi. Это не только язык, но и среда разработки.

R>Так в Delphi он тоже не работает для дженериков


Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.
Ну во С++ ники очень и любили блокнот и консоль, ибо это лучшая среда разработки!
Твой путь видно такой! Удачи!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.09.2023 10:28 Serginio1 . Предыдущая версия .
Re[2]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:34
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Я вообще не понимаю, как компиляция и рефлексия мешают друг другу.

vsb>Рефлексия это тупо кучка констант, с адресами и смещениями.

Цель AOT в том числе — уменьшение размера загружаемого в память образа. А эта "куча констант" и есть львиная доля объема сборок, которые поставляются вместе даже с минимальным приложением на .net.
Re[4]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:36
Оценка:
Здравствуйте, vsb, Вы писали:

S>> А если типа нет в сборке или они обрезаются, так как нет использования.

vsb>Не очень понял. Чтобы не обрезалось — надо обрезальщик делать умней. Если кода в сборке нет, то и рефлексия не нужна.
Вообще не факт. Например сборка data-классов, которые сериализуются в json и хранятся в базе. Кода нет, а метаданные есть и очень нужны.
Re[6]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:39
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Serginio1, Вы писали:


S>> Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.


R>В Delphi и натив, и память не жрется, и рефлексия в полный рост Дотнед, смотрю, окостыливается вместе с шарпом...

Там же IDispatch рефлексия, в .NET начиная с Core рефлексия используется для рантайм кодогенерации. Вот её хотят в компайлтайм перевести для AOT.
Re[3]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:45
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

Р>Здравствуйте, gandjustas, Вы писали:


Р>>>Зашибись конечно.

Р>>>Те использование аот это бег по минному полю. понимаю...
G>>Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти
Р>предупреждения это же не точно, такое себе как обойти. точно разве нельзя вычислить по АСТ?
сделай treat warnings as error в этой категории



Р>>>тот же null как false в js это же из лиспа пошло.

G>>А не из C?
Р>на конфе слышал про цитату что js это лисп для браузера. отсюда и вывод.
Как в анекдоте: маша считает себя моделью и творческой личностью, а в подъезде на стене написано другое.
Если говорить о первоисточниках, то null как false было и в C, и, самое главное, в ассемблере. Ибо нулевая ссылка на объект это просто число ноль, которое является false и выставляет zero flag при операции or\and\cmp само с собой.
Re[7]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 23.09.23 12:39
Оценка:
Здравствуйте, gandjustas, Вы писали:

g> R>В Delphi и натив, и память не жрется, и рефлексия в полный рост


g> Там же IDispatch рефлексия


Нет. IDispatch отдельно, рефлексия отдельно:
program Project1;
uses
  System.Rtti, System.Classes;
begin
  var t := TRttiContext.Create.GetType(TFileStream);

  WriteLn('Fields:');
  for var f in t.GetFields do
    WriteLn('  ', f.ToString);

  WriteLn('Methods:');
  for var m in t.GetMethods do
    WriteLn('  ', m.ToString);
end.


Результат:
Fields:
  FFileName: string @ 08
  FHandle: NativeUInt @ 04
Methods:
  constructor Create(const AFileName: string; Mode: Word)
  constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal)
  destructor Destroy
  constructor Create(AHandle: NativeUInt)
  function Read(var Buffer; Count: Integer): Integer
  function Write(const Buffer; Count: Integer): Integer
  function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64
  function Read(var Buffer; Count: Integer): Integer
  function Write(const Buffer; Count: Integer): Integer
  function Read(Buffer: TArray<System.Byte>; Offset: Integer; Count: Integer): Integer
  function Write(const Buffer: TArray<System.Byte>; Offset: Integer; Count: Integer): Integer
  function Read(var Buffer: TArray<System.Byte>; Count: Integer): Integer
  function Write(const Buffer: TArray<System.Byte>; Count: Integer): Integer
  function Read64(Buffer: TArray<System.Byte>; Offset: Int64; Count: Int64): Int64
  function Write64(const Buffer: TArray<System.Byte>; Offset: Int64; Count: Int64): Int64
  function ReadData(Buffer: Pointer; Count: NativeInt): NativeInt
  function ReadData(const Buffer: TArray<System.Byte>; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Boolean): NativeInt
  function ReadData(var Buffer: Boolean; Count: NativeInt): NativeInt
  function ReadData(var Buffer: AnsiChar): NativeInt
  function ReadData(var Buffer: AnsiChar; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Char): NativeInt
  function ReadData(var Buffer: Char; Count: NativeInt): NativeInt
  function ReadData(var Buffer: ShortInt): NativeInt
  function ReadData(var Buffer: ShortInt; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Byte): NativeInt
  function ReadData(var Buffer: Byte; Count: NativeInt): NativeInt
  function ReadData(var Buffer: SmallInt): NativeInt
  function ReadData(var Buffer: SmallInt; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Word): NativeInt
  function ReadData(var Buffer: Word; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Integer): NativeInt
  function ReadData(var Buffer: Integer; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Cardinal): NativeInt
  function ReadData(var Buffer: Cardinal; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Int64): NativeInt
  function ReadData(var Buffer: Int64; Count: NativeInt): NativeInt
  function ReadData(var Buffer: UInt64): NativeInt
  function ReadData(var Buffer: UInt64; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Single): NativeInt
  function ReadData(var Buffer: Single; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Double): NativeInt
  function ReadData(var Buffer: Double; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Extended): NativeInt
  function ReadData(var Buffer: Extended; Count: NativeInt): NativeInt
  function ReadData(var Buffer: TExtended80Rec): NativeInt
  function ReadData(var Buffer: TExtended80Rec; Count: NativeInt): NativeInt
  function WriteData(const Buffer: TArray<System.Byte>; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Pointer; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Boolean): NativeInt
  function WriteData(const Buffer: Boolean; Count: NativeInt): NativeInt
  function WriteData(const Buffer: AnsiChar): NativeInt
  function WriteData(const Buffer: AnsiChar; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Char): NativeInt
  function WriteData(const Buffer: Char; Count: NativeInt): NativeInt
  function WriteData(const Buffer: ShortInt): NativeInt
  function WriteData(const Buffer: ShortInt; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Byte): NativeInt
  function WriteData(const Buffer: Byte; Count: NativeInt): NativeInt
  function WriteData(const Buffer: SmallInt): NativeInt
  function WriteData(const Buffer: SmallInt; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Word): NativeInt
  function WriteData(const Buffer: Word; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Integer): NativeInt
  function WriteData(const Buffer: Integer; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Cardinal): NativeInt
  function WriteData(const Buffer: Cardinal; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Int64): NativeInt
  function WriteData(const Buffer: Int64; Count: NativeInt): NativeInt
  function WriteData(const Buffer: UInt64): NativeInt
  function WriteData(const Buffer: UInt64; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Single): NativeInt
  function WriteData(const Buffer: Single; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Double): NativeInt
  function WriteData(const Buffer: Double; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Extended): NativeInt
  function WriteData(const Buffer: Extended; Count: NativeInt): NativeInt
  function WriteData(const Buffer: TExtended80Rec): NativeInt
  function WriteData(const Buffer: TExtended80Rec; Count: NativeInt): NativeInt
  function Seek32(const Offset: Integer; Origin: TSeekOrigin): Int64
  function Seek(Offset: Integer; Origin: Word): Integer
  function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64
  function Seek(const Offset: Int64; Origin: Word): Int64
  procedure ReadBuffer(var Buffer; Count: NativeInt)
  procedure ReadBuffer(var Buffer: TArray<System.Byte>; Count: NativeInt)
  procedure ReadBuffer(var Buffer: TArray<System.Byte>; Offset: NativeInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Boolean)
  procedure ReadBufferData(var Buffer: Boolean; Count: NativeInt)
  procedure ReadBufferData(var Buffer: AnsiChar)
  procedure ReadBufferData(var Buffer: AnsiChar; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Char)
  procedure ReadBufferData(var Buffer: Char; Count: NativeInt)
  procedure ReadBufferData(var Buffer: ShortInt)
  procedure ReadBufferData(var Buffer: ShortInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Byte)
  procedure ReadBufferData(var Buffer: Byte; Count: NativeInt)
  procedure ReadBufferData(var Buffer: SmallInt)
  procedure ReadBufferData(var Buffer: SmallInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Word)
  procedure ReadBufferData(var Buffer: Word; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Integer)
  procedure ReadBufferData(var Buffer: Integer; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Cardinal)
  procedure ReadBufferData(var Buffer: Cardinal; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Int64)
  procedure ReadBufferData(var Buffer: Int64; Count: NativeInt)
  procedure ReadBufferData(var Buffer: UInt64)
  procedure ReadBufferData(var Buffer: UInt64; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Single)
  procedure ReadBufferData(var Buffer: Single; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Double)
  procedure ReadBufferData(var Buffer: Double; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Extended)
  procedure ReadBufferData(var Buffer: Extended; Count: NativeInt)
  procedure ReadBufferData(var Buffer: TExtended80Rec)
  procedure ReadBufferData(var Buffer: TExtended80Rec; Count: NativeInt)
  procedure WriteBuffer(const Buffer; Count: NativeInt)
  procedure WriteBuffer(const Buffer: TArray<System.Byte>; Count: NativeInt)
  procedure WriteBuffer(const Buffer: TArray<System.Byte>; Offset: NativeInt; Count: NativeInt)
  procedure WriteBufferData(var Buffer: Integer; Count: NativeInt)
  function CopyFrom(const Source: TStream; Count: Int64; BufferSize: Integer): Int64
  function ReadComponent(const Instance: TComponent): TComponent
  function ReadComponentRes(const Instance: TComponent): TComponent
  procedure WriteComponent(const Instance: TComponent)
  procedure WriteComponentRes(const ResName: string; const Instance: TComponent)
  procedure WriteDescendent(const Instance: TComponent; const Ancestor: TComponent)
  procedure WriteDescendentRes(const ResName: string; const Instance: TComponent; const Ancestor: TComponent)
  procedure WriteResourceHeader(const ResName: string; out FixupInfo: Integer)
  procedure FixupResourceHeader(FixupInfo: Integer)
  procedure ReadResHeader
  constructor Create
  procedure Free
  procedure DisposeOf
  class function InitInstance(Instance: Pointer): TObject
  procedure CleanupInstance
  function ClassType: TClass
  class function ClassName: string
  class function ClassNameIs(const Name: string): Boolean
  class function ClassParent: TClass
  class function ClassInfo: Pointer
  class function InstanceSize: Integer
  class function InheritsFrom(AClass: TClass): Boolean
  class function MethodAddress(const Name: ShortString): Pointer
  class function MethodAddress(const Name: string): Pointer
  class function MethodName(Address: Pointer): string
  class function QualifiedClassName: string
  function FieldAddress(const Name: ShortString): Pointer
  function FieldAddress(const Name: string): Pointer
  function GetInterface(const IID: TGUID; out Obj): Boolean
  class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry
  class function GetInterfaceTable: PInterfaceTable
  class function UnitName: string
  class function UnitScope: string
  function Equals(Obj: TObject): Boolean
  function GetHashCode: Integer
  function ToString: string
  function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HRESULT
  procedure AfterConstruction
  procedure BeforeDestruction
  procedure Dispatch(var Message)
  procedure DefaultHandler(var Message)
  class function NewInstance: TObject
  procedure FreeInstance
  destructor Destroy
avalon/3.0.2
Re[33]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 12:39
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.


Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?

S> R>Так в Delphi он тоже не работает для дженериков


S> Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.


У Free Pascal все это тоже есть, прикинь.
avalon/3.0.2
Re[34]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 14:29
Оценка:
Здравствуйте, rudzuk, Вы писали:



S>> Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.


R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?

То есть если наложили ограничения значит это костыль? При этом ты имеешь все плюсы типизации. Напомню про TS. Там все компилируется в JS но с аннотацией типов, проверкой синтаксиса и интеллисенсом. Именно по этому его популярность и растет.

Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.
S>> R>Так в Delphi он тоже не работает для дженериков

S>> Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.


R>У Free Pascal все это тоже есть, прикинь.

Прикинь ты говорил, что не нужна среда разработки

Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.


То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!
А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!
При этом если среда разработки не понимает ограничения, то это не проблема языка?
А программировать значит в блокноте. Самая лучшая среда, для всех языков!
Мне тебя трудно понять
и солнце б утром не вставало, когда бы не было меня
Re[35]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 16:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?


S> То есть если наложили ограничения значит это костыль?


Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.

S> Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.


Типизация никуда не исчезает, не говори глупости. Просто контроль типов переходит в фазу специализации. Мне все по три раза тебе повторять?

S> Прикинь ты говорил, что не нужна среда разработки


Где это я такое сказал? Посыл тех слов, что ты отквотил совершенно другой, перечитайка.

S> То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!


Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.

S> А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!


С чего бы не проверяться синтаксису? Опять выдумываешь чего-то... Еще раз посмотри в код приведенного мной дженерика и скажи в каком его месте тебе потребовался бы интелисенс?

S> При этом если среда разработки не понимает ограничения, то это не проблема языка?


Именно так.

S> А программировать значит в блокноте. Самая лучшая среда, для всех языков!


Ты уже три раза упомянул блокнот. С чего вдруг? Фетишь такой, или что? Или любая недоработка IDE сразу превращает ее в блокнот?

S> Мне тебя трудно понять


А ты попробуй читать внимательно и все у тебя получится.
avalon/3.0.2
Re[36]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 16:13
Оценка:
Здравствуйте, rudzuk, Вы писали:



S>> R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?


S>> То есть если наложили ограничения значит это костыль?


R>Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.

Почему не могу? А на шаблонах можно? Еще раз расскажи чем шаблон без ограничений лучше с ограничениями!
Почему с ограничениями это костыль. Ты так и не объяснил!
S>> Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.

R>Типизация никуда не исчезает, не говори глупости. Просто контроль типов переходит в фазу специализации. Мне все по три раза тебе повторять?

Угу. То есть на этапе кодирования я работаю без интеллисенса и синтаксической проверки.
Как с динамической типизацией.

Я об этом тебе уже 100 сообщений говорю. Но ты так и стоишь на своем.

S>> Прикинь ты говорил, что не нужна среда разработки


R> Где это я такое сказал? Посыл тех слов, что ты отквотил совершенно другой, перечитайка.


S>> То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!


R>Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.

Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math
static T Add<T>(T left, T right)
    where T : INumber<T>
{
    return left + right;
}


S>> А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!


R>С чего бы не проверяться синтаксису? Опять выдумываешь чего-то... Еще раз посмотри в код приведенного мной дженерика и скажи в каком его месте тебе потребовался бы интелисенс?

В твоем примере только Inc. Но на самом то деле тип может поддерживать кучу методов и свойств.

S>> При этом если среда разработки не понимает ограничения, то это не проблема языка?


R>Именно так.


S>> А программировать значит в блокноте. Самая лучшая среда, для всех языков!


R>Ты уже три раза упомянул блокнот. С чего вдруг? Фетишь такой, или что? Или любая недоработка IDE сразу превращает ее в блокнот?

Ну раз среда не поддерживает язык, то блокнот для тебя самая лучшая среда.
Обычно под язык и среда разработки совершенствуется и наоборот как с SG.

S>> Мне тебя трудно понять


R>А ты попробуй читать внимательно и все у тебя получится.

Ну так ты пишешь и сам же себя опровергаешь!

По твоим словам дженерики это костыль. Но шаблоны с ограничениями не костыль.
Но при этом нет различия между дженериками и шаблонами с ограничениями.

В .Net Native Il код переводился в C++. А как известно в C++ нет дженериков (во всяком случае на тот момент)
То есть для AOT это все те же шаблоны с ограничениями.
и солнце б утром не вставало, когда бы не было меня
Re[37]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 18:48
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.


S> Почему не могу?


По факту.

S> А на шаблонах можно?


Конечно можно.

S> Еще раз расскажи чем шаблон без ограничений лучше с ограничениями!

S> Почему с ограничениями это костыль. Ты так и не объяснил!

Потому что в шаблоне мы просто пишем: "left + right" и это работает вообще для любых типов: числовых, строковых, динамических массивов, вообще любых типов для которых применима операция сложения.

S> Угу. То есть на этапе кодирования я работаю без интеллисенса и синтаксической проверки.

S> Как с динамической типизацией.

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

S> R>Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.


S> Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math


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

S>
S> static T Add<T>(T left, T right)
S>     where T : INumber<T>
S> {
S>     return left + right;
S> }
S>


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

S> Ну раз среда не поддерживает язык, то блокнот для тебя самая лучшая среда.


Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.
avalon/3.0.2
Re[38]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 19:33
Оценка:
Здравствуйте, rudzuk, Вы писали:



S>> Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math


R>Я тебе говорю, что ты не можешь это сделать без генерикматх, а ты приводишь пример, как ты это делаешь с генерикматх. Выдыхай бобер!


S>>
S>> static T Add<T>(T left, T right)
S>>     where T : INumber<T>
S>> {
S>>     return left + right;
S>> }
S>>


R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.

А вот нахрена? Но ты можешь на перегрузке операторов сделать интерфейс.
Кстати в начальных вариациях предлагалось для перегрузки операторов сделать свою реализацию
https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3?view=net-7.0
Используй интерфейс, или делегат. Для не чисел, там выхлоп от инлайнинга небольшой.
Только я вот как то плохо представляю как скрестить строки и Rec.
В большинстве дженерики нужны для коллекций или чисел.

S>> Ну раз среда не поддерживает язык, то блокнот для тебя самая лучшая среда.


R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.

Ну тогда и не говори, что IDE не нужна. А язык без IDE это блокнот.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.09.2023 19:43 Serginio1 . Предыдущая версия .
Re[39]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 20:22
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> S>>
S> S>> static T Add<T>(T left, T right)
S> S>>     where T : INumber<T>
S> S>> {
S> S>>     return left + right;
S> S>> }
S> S>>


S> R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.


S> А вот нахрена?


Ну чего тебе сложно что-ли? Или нужных костылей не подвезли?

S> Только я вот как то плохо представляю как скрестить строки и Rec.

S> В большинстве дженерики нужны для коллекций или чисел.



S> R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.


S> Ну тогда и не говори, что IDE не нужна.


Я этого никогда не говорил, не приписывай мне свои фантазии.

S> А язык без IDE это блокнот.


Выдыхай, выдыхай!
avalon/3.0.2
Re[40]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.23 07:55
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Serginio1, Вы писали:


S>> S>>
S>> S>> static T Add<T>(T left, T right)
S>> S>>     where T : INumber<T>
S>> S>> {
S>> S>>     return left + right;
S>> S>> }
S>> S>>


S>> R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.


S>> А вот нахрена?


R>Ну чего тебе сложно что-ли? Или нужных костылей не подвезли?

На самом деле использование перегрузки операторов где попало это и есть костылю. В С++ даже битовые операции применят ко всему, что угодно.
Вот это и есть костыль.
Для примера возьмем ту же самую сортировку и <>=/
Те же строки по разному сравниваются, а у класса можно сортировать по разным свойствам итд.

S>> Только я вот как то плохо представляю как скрестить строки и Rec.

S>> В большинстве дженерики нужны для коллекций или чисел.

R>

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

Ты вот приведи пример шаблона где могут складываться и строки и Rect
S>> R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.

S>> Ну тогда и не говори, что IDE не нужна.


R>Я этого никогда не говорил, не приписывай мне свои фантазии.


Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? [А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.

и солнце б утром не вставало, когда бы не было меня
Re[41]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 24.09.23 08:31
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> На самом деле использование перегрузки операторов где попало это и есть костылю. В С++ даже битовые операции применят ко всему, что угодно.

S> Вот это и есть костыль.
S> Для примера возьмем ту же самую сортировку и <>=/
S> Те же строки по разному сравниваются, а у класса можно сортировать по разным свойствам итд.

Давай без бла-бла. Код покажи, на божественных дженериках.

S> Я имел ввиду, что использование математических операций это для числел, коллекции, словари с вычислением Hash кода, который может быть различным даже для одного класса, в зависимости, какие поля хотим сравнивать итд.


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

S> Ты вот приведи пример шаблона где могут складываться и строки и Rect


Я его тебе уже показал: left + right, если ты не понял.

S> S>> Ну тогда и не говори, что IDE не нужна.


S> R>Я этого никогда не говорил, не приписывай мне свои фантазии.


S> Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? [А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.


И где ты видишь слова о том, что IDE не нужна? Тут сказано, что язык не нужен, если его без IDE читать невозможно
avalon/3.0.2
Re[42]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.23 09:33
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> На самом деле использование перегрузки операторов где попало это и есть костылю. В С++ даже битовые операции применят ко всему, что угодно.

S>> Вот это и есть костыль.
S>> Для примера возьмем ту же самую сортировку и <>=/
S>> Те же строки по разному сравниваются, а у класса можно сортировать по разным свойствам итд.

R>Давай без бла-бла. Код покажи, на божественных дженериках.

https://learn.microsoft.com/ru-ru/dotnet/api/system.collections.generic.list-1.sort?view=netcore-3.1

S>> Я имел ввиду, что использование математических операций это для числел, коллекции, словари с вычислением Hash кода, который может быть различным даже для одного класса, в зависимости, какие поля хотим сравнивать итд.


R>Да знаю я чего ты имел ввиду: если шарп не могет, то это и не нужно Все же просто До генерикматха и вычислительные операции в дженериках не нужны были, правда же?


S>> Ты вот приведи пример шаблона где могут складываться и строки и Rect


R>Я его тебе уже показал: left + right, если ты не понял.

А я тебе показал
Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math
static T Add<T>(T left, T right)
    where T : INumber<T>
{
    return left + right;
}




Реализуй для своего класса IAdditionOperators
https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3?view=net-7.0
И используй если тебе этого хочется.

Но ты покажи реальный шаблон который не просто складывает, а что то делает полезное складывая для строк и Rect.

И ты как то отмел использование перегрузки операций для различных типов сравнения и сложения.
В итоге придешь к дженериковским интерфейсам или методам.
То есть использование перегрузки операторов нужна для чисел. Во всех остальных случаях ты так же будешь использовать то же что и в дженериках.
Поэтому в C# не пошли твоим путем. Хотя такие предложения были http://rsdn.org/forum/dotnet/7749568.flat
Автор: varenikAA
Дата: 08.06.20

interface IMonoid<T>
{
static T Zero{get;}
static T operator+(T t1, T t2)
static T operator*(T t1, T t2)
}


И можно было бы переопределять методы для типа
role IntMonoid extednds int
{
public static int Zero = 0;
}

То есть Zero переопределялся, а operator берутся из класса.

Но отказались.
S>> S>> Ну тогда и не говори, что IDE не нужна.

S>> R>Я этого никогда не говорил, не приписывай мне свои фантазии.


S>> Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? [А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.


R>И где ты видишь слова о том, что IDE не нужна? Тут сказано, что язык не нужен, если его без IDE читать невозможно


Мне не нужен язык с монструозной IDE.
Не монструозная IDE это блокнот.
При этом это был ответ на
S> Ну и нахрен такой язык нужен если нет нормального среды разработки.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.09.2023 10:06 Serginio1 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.