OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 14:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 09:57 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Я бы определил статически типизированный язык как язык, в котором присутствует система статической типизации
как хребет всей конструкции языка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 10:59 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Я бы определил статически типизированный язык как язык, в котором присутствует система статической типизации.
Я понимаю, что мы говорили о разных вещах или, наоборот, об одном и том же с разных точек зрения, но если попытаться подытожить Ваши высказывания, начиная с этого, то в моём восприятие получается такое:
статически типизированные дженерики можно сделать такими же гибким и удобным как динамические, потому что гибки и удобны динамически типизированные дженерики в Dart, являющийся статически типизированным языком, потому что в нём есть статическая типизация на выбор, в основе которой лежит динамическая типизация, чтобы переменные можно было стыковать с динамическими дженериками.

На мой взгляд, тут такая же разница в понятиях, что и между модульностью Оберона и раздельной сборкой файлов Си. Но если, всё же, подход Dart считать статически типизированным, то зачем тогда было пинать Java? Там точно такой же подход с поправкой на то, что в основе статических типов не лежит динамика, поэтому нельзя произвольные переменные стыковать с дженериками, на первый взгляд для них подходящими. И это ровно то, что ждало бы КП, если бы в него добавили дженерики таким образом.

Повторю сказанное ранее:
1. Гиблое дело пытаться соревноваться с гибкостью динамического подхода с помощью параметризуемых, но статических типов (в Dart и не боролись)
2. Динамический язык - не означает отсутствие какого-либо контроля.
3. Сделать шаблоны хорошо непросто. Если они не учитывались в языке как центральная концепция с самого начала, то будут корявой нашлёпкой(как в Java)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 15:35 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
В С++ шаблоны тоже не учитывались с самого начала.
Однако же сейчас обобщенное программирование - это практически половина С++.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 15:36 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Скажете, что в С++ шаблоны, как и всё остальное - это не корявая нашлёпка?


Последний раз редактировалось Comdiv Понедельник, 18 Май, 2020 15:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 15:43 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Скажу.
Он не для рядового прикладного программиста.
Все шаблоны в С++ разработаны суперпрограммистами для суперпрограммистов, которые пишут инструменты для рядовых программистов.
Все стандартная библиотека на этом построена.
И все последние нововведения на тему шаблонов направлены на то, чтобы облегчить программирование стандартной библиотеки этим суперпрограммистам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 18 Май, 2020 15:47 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
"Здесь мерилом работы считают усталость"?
Оправдания это. Приятно мнить себя суперпрограммистом. Это как Кразы назвать грузовиками для суперводителей, но называли их людоедами. C++ тоже периодически кушает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Среда, 20 Май, 2020 19:08 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Но если, всё же, подход Dart считать статически типизированным, то зачем тогда было пинать Java?


В Java с первых дней его существования слишком большая свалка случайный решений.
Это сочетается с претензией на универсальность языка. А для универсальности много ошибок (только динамика, без стековых структур и т.п.)
Синтаксис длинный, громоздкий (и эти люди говорят про "многословность Паскаля").
В общем, язык из 90-х.

Поэтому я его вообще не рассматриваю - его никто и не возьмёт сегодня там, где нужно экономичное решение (по трудозатратам, общей стоимости и т.п.)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Среда, 20 Май, 2020 22:18 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллеги, я наэн чего-то упустил, пока отвлекся от айти. Разъясните, пож, вот что.

В 90-е (мож чуть раньше) статически типизированным называли старый (добрый) Паскаль. А поскольку в Турбо-Паскале появились объекты, с ними пришло и понятие динамического типа. И соответственно его и С++ с Джавой стали называть динамически типизируемыми языками. Появились всякие RTTI и проч. Оберон тоже вроде как относился к языкам с динамической типизацией. Про типизацию в джаваскрипте даже вопрос не стоял - это был просто какой-то крючкоязык вообще без всякой типизации: помещай что хочешь куда хочешь, не ошибешься ).

Потом я за темой не следил, и тут вдруг - опа! - джаваскрипт - язык с динамической типизацией. Когда, кто и на каком основании вообще назвал тамошнее бессистемие - типизацией? И почему вдруг КП (да и джава) стали языками статической типизации?

Одним словом, терминологическая путаница. У меня.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 00:47 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
adimetrius писал(а):
И соответственно его и С++ с Джавой стали называть динамически типизируемыми языками.

Не было такого. Классический полиморфизм реализуется посредством динамического (или позднего) связывания, т.е. когда выбор вызываемого (полиморфного) метода делается во время выполнения, а не трансляции. Динамическая типизация - вид типизации, при использовании которой тип переменной определяется во время выполнения (при присваивании переменно значения), а не на этапе трансляции (при её объявлении). Очевидно, что слово "динамический" и там, и там имеет одно и тоже значение - служит для описания ситуации, в которой некий выбор (вызываемого метода, типа переменной) делается во время выполнения, но в целом эти концепции ортогональные. То что динамическое связывание можно (и в целом проще) реализовать через динамическую типизацию - не существенно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 02:26 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Dart не претендует на роль универсального языка, а на роль строго статически типизированного сценарного языка для GUI.

Может, языка со строгой динамической типизацией?
https://dartpad.dev/
Код:
void printInts(List<int> a) => print(a);

void printList(List<dynamic> a) {
  print(a);
  /* меняем элемент законным для динамического массива значением */
  a[1] = "Бу";
}

void main() {
  /* массив динамических(аналог Object) элементов, заполняемый целыми */
  var list = <dynamic>[1, 2];
 
  try {
    /* Засовываем List<dynamic> аргументом в List<int> - на этапе трансляции ошибок нет */
    printInts(list);
  } catch(e) {
    /* Но на этапе выполнения прилетает птичка - тип проверяется динамически */
    print("1. $e");
  }
  /* Печать и модификация динамического массива происходит как ожидалось */
  printList(list);
 
  /* Меняем тип значения переменной с List<dynamic> на List<int>,
   * при этом тип переменной остаётся прежним - List<dynamic> */
  list = <int>[1, 2];

  /* Теперь печать целых происходит без приключений */
  printInts(list);
 
  try {
    printList(list);
  } catch(e) {
    /* Но модифицировать строкой вместо целых уже нельзя, хотя в сигнатуре явно
     * указан массив динамического типа */
    print("2. $e");
  }
 
  /* теперь объявим переменную типа List<int> */
  var ints = <int>[2, 3];
 
  /* А такой переменной нельзя так нагло засовывать массив динамических элементов -
   * ошибка компиляции
  ints = <dynamic>[];
  */
  try {
    /* Зато так можно */
    list = [];
    ints = list;
  } catch(e) {
    /* но, естественно, будет ошибка времени исполнения */
    print("3. $e");
  }
 
  /* Статическая типизация теперь выглядит так, и тут ещё много такого.
   * Например, попробуйте предсказать поведение программы, если list в первой строке
   * объявить так: var list = [1, 2];
   *
   * А, вообще, это приличное поведение для динамически типизированного языка -
   * получше многих, включая Python.
   */
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 03:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну вы же сами "отпустили" типизацию в коде: объявили максимально полиморфное ANY.
Я не понимаю, что вы вкладываете тогда в понятие современно строго статически типизированного языка.
Нечто с глобальным анализом кода и автовыводом типов?
Когда всё, что можно проверить статически, проверяется статически, без откладывания на этап выполнения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 16:52 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Все шаблоны в С++ разработаны суперпрограммистами для суперпрограммистов
Всех в Байкал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 17:25 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
Илья Ермаков писал(а):
Ну вы же сами "отпустили" типизацию в коде: объявили максимально полиморфное ANY.
Я не понимаю, что вы вкладываете тогда в понятие современно строго статически типизированного языка.
Нечто с глобальным анализом кода и автовыводом типов?
Когда всё, что можно проверить статически, проверяется статически, без откладывания на этап выполнения?

Для TypeScript имеется расширение StrongScript, где в дополнение к опциональной типизации введена и строгая. В отличие от Dart в TypeScript ещё веселее благодаря наличию структурной эквивалентности (утиной типизации для классов. Что несколько неожиданно -- это в гугловском Dart-е после гугловского Go "уточки" были бы неудивительными). Несмотря на ограничения "утиной структурности" для private/protected-членов класса некоторые проблемы с типами, всё же, возникают, в статейке ниже имеются примеры (также при строгой типизации возможны дополнительные оптимизации в альтернативной реализации JavaScript-движка). Там же наглядно представлена и разница в понятиях насчёт типизации:
Concrete Types for TypeScript
Цитата:
StrongScript builds on and extends TypeScript. Syntactically, the only addition is a new type constructor, written !. This yields three three kinds of type annotations:

Dynamic types, denoted by any, represent values manipulated with no static restrictions. Any object can be referenced by a any variable, all operations are allowed and any may fail at runtime.

Optional types, denoted by class names C, enable local type checking. All manipulations of optionally typed variables are verified statically against C’s interface. Optionally typed variables can reference arbitrary values, and so runtime checks are required to verify that those values conform to C’s interface.

Concrete types, denoted by !C, represent objects that are instance of the homonymous class or its subclasses. Static type checking is performed on these, and no dynamic checks are needed in the absence of downcasts.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 17:39 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
adimetrius писал(а):
Тогда, во-вторых, можно, например, сделать проверку соответствия фактических типов в присваивании, подобно проверке индексов. И при нарушении соответствия типа в fa[i] := u производить авост.
Придется ввести

* понятие "терминального типа массива": в объявлении
...
* и какое-то обозначение для него, чтобы производить проверку:

Для агрегатных типов можно выкрутиться без дженериков, магической рефлексии и "особых алиасов на типы". Для Паскаля когда-то был (собственно-то, и есть) неплохой концепт контейнеров-"всемогуторов":
http://sourceforge.net/projects/adot/
Код:
{
  General format of ADOT type construction:
    <DataType>.Create(<ContainerType> [,Field1Type [,Field2Type ...]])
  where
    <DataType> is any data-type class (TTString, TTByte, TTPointer, TTInteger, ...)
    <ContainerType> is any container class (TCVector, TCList, TCMap, TCHeap, ...)

  Examples:
    TTInteger.Create(TCSet)                         // set of integers
    TTWideString.Create(TCMap, [TTInteger]);        // map of string keys with integer values
    TTDouble.Create(TCVector, [TTDouble, TTString]) // vector of doubles with two additional fields
    TTString.Create(TCSet, [TTByte])                // set of strings with one additional field
    ...

  You don't have to remember all data-type classes. ADOT supports ALL Delphi
  built-in data types. Just write TT<type> where <type> is what you need
  (TTByte, TTString, TTInteger, TTDouble, ...)

  IMPORTANT: DO NOT CALL DESTRUCTOR FOR ADDITIONAL FIELDS. THEY WILL BE
  DESTROYED AUTOMATICALLY FROM DESTRUCTOR OF MAIN FIELD.
}

...

// demonstrates creating of container with one field (TCVector, TCSList,
// TCDList, TCPriorityList, TCStack, TCDeque, ...)
procedure Demo1;
var
  n : TTInteger;
  m : TTDouble;
begin
  writeln;
  writeln('Vector of integers');
  n := TTInteger.create(TCVector);
  n.add([1,2,3,7,6,5]);
  n.Println(ffDefault, true);
  n.free;

  // Some containers MUST have two fields at least: TCMap, TCMultimap,
  // TCUnsortedMap. But we can add any number of additional fields to
  // any container!
  n := TTInteger.create(TCList, [TTDouble]);
  m := n.fields[1] as TTDouble;
  n.AddRecord([1, 0.999]);
  n.AddRecord([2, 1.785]);
  n.AddRecord([3, 3.1415926]);
  m[n.Add(4)] := 4.12;
  m[n.Add(5)] := 5.07;
  writeln;
  writeln('List with two fields');
  n.println;
  n.free;
end;

...

// demonstrates creating of container with two field (TCMap, TCMultimap,
// TCUnsortedmap)
// for mapping of doubles to strings
procedure Demo2;
var
  n : TTDouble;
  s : TTString;
begin
  writeln;
  writeln('Multimap(key: double; value: string)');
  n := TTDouble.create(TCMultimap, [TTString]);
  s := n.Fields[1] as TTString;

  // set some values with .Map property
  n.Map[3.14] := 'Pi';
  n.Map[2.72] := 'E';

  // another way to add data
  // now we have full checking of types in compile-time
  s[n.Add(1.618)] := 'Golden Ration';
  s[n.Add(1.618)] := 'Golden';

  // reassign
  n.Map[3.14] := 'pi';
  s[n.Find(2.72)] := 'e';

  n.Println;
  n.free;
end;

...

procedure Demo1;
var
  n: TTInteger;
  h: TCHandle;
  i,j: integer;
begin
  writeln;
  writeln('Vector of integers');
  n := TTInteger.create(TCVector);
  n.add([1,2,3,7,6,5]);

  // correct way to access items for any container
  h := n.First;
  for i:=0 to n.Count-1 do
  begin
    write(n[h], ' ');
    n.Next(h);
  end;
  writeln;

  // another way
  h := n.First;
  while h<>-1 do
  begin
    write(n[h], ' ');
    n.Next(h);
  end;
  writeln;

  // one more way
  h := n.First;
  while h<>-1 do
    write(n[n.MoveNext(h)], ' ');
  writeln;

  // accessing items by index (correct only for TCVector)
  for i := 0 to n.Count-1 do
    write(n[i], ' ');
  writeln;

  // accessing items by index (correct for all containers)
  for i := 0 to n.Count-1 do
    write(n[n.handles[i]], ' ');
  writeln;

  // find sum
  j := 0;
  for i := 0 to n.Count-1 do
    inc(j, n[n.handles[i]]);
  writeln('sum: ', j);

  n.free;
end;

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

Недостатком является потребность в реализации полей-прокладок для своих типов (к тому же, есть некая "типо-некорректность", напр., свойство ".Map" (в коде выше) доступно лишь тогда, когда "поле" является "главным" или первичным и в контейнере вида Map, необходимы соответствующие assert-ы, которые однако можно отключать для производительности). А в принципе-то, в основном достаточно и базовых типов. Сейчас древний "dataset" после Jai преподносится как новая парадигма "Data-oriented design" (Хабр1 , Хабр2, Хабр3).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 17:43 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
adimetrius писал(а):
И не нужны дженерики )

На форуме вспомнилась дискуссия, где был примерчик потребности в них:
https://forum.oberoncore.ru/viewtopic.php?f=30&t=5983&view=next#p100016

Т.е. применяются обобщённые алгоритмы не только с агрегатными типами, но и с самим "предметным" объектом (нет объектов-посредников, их возможный ввод в использование (напр., те же указатели с тестированием и приведением типа) будет крайне неудобным).

Да и с неким механизмом дженериков/макросов те же агрегаты выше можно реализовать чуть иначе, более эффективно и удобнее, причём как для статических структур (известных в compiletime), так и для динамических, состав которых возникает в runtime.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 17:52 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
adimetrius писал(а):
А развитие Паскаля-Модулы-Оберона идет по пути выкидывания избыточных средств, "лишних" - т.е. таких, которые можно выразить другими средствами. Оставили только то, что уже не выкинешь.
(Ну, строго говоря, можно и присваивание выкинуть, но тогда уже будет другая парадигма ;)
Начали с Оккама: Не следует множить сущее без необходимости. Продолжили Эйнштейном: Make it as simple as possible, but not simpler. А недавно додумались, как даже эти простые максимы сократить: Less is more. Что на русский можно перевести: Лучше меньше.

Когда-то здесь на форуме были философские дискуссии по поводу. Например:
https://forum.oberoncore.ru/viewtopic.php?f=26&t=808&start=140#p68703
alexus писал(а):
Сергей Прохоренко писал(а):
Минимизация языка программирования – тоже не панацея. Для программирования высокоуровневых конструкций на минимальном языке придется использовать изощренные приемы и писать много кода.

Попробую поделится наблюдениями... Если взять всего две базовых конструкции: присваивание и сравнение (как частный случай арифметики), то этого вполне достаточно для написания программ... но трудоёмко. Чтобы снизить трудозатраты, дадим возможность создавать и поименовывать комплексы/агрегаты из этих двух конструкций - макроопределения. Трудозатраты снизятся примерно в 1000 раз при росте многообразия примерно в 100 раз. Введём правила создания макросов, например, правила структурного программирования (описание и построение минимального количества оптимальных/универсальных комплексов)... трудозатраты на разработку программ снизятся ещё в 10...100 раз, а многообразие уменьшится примерно в те же 10...100 раз.
Вообще, вопрос минимизации количества типов элементов является очень интересным с точки зрения семантики систем. И любая(!) большая система (более 4-х уровней), образует ромб, где повышение многообразия сменяется его уменьшением... и всё это происходит не случайно, а вполне закономерно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 21 Май, 2020 17:54 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
adimetrius писал(а):
(* Между прочим, коллеги, я претендую на самую краткую русскую формулировку девиза Оберона: Лучше меньше! )) *)

Как-то сухо, нет контекста, что же именно сопоставляется/сравнивается. Имхо, как вариант, суть "ромба" выше: "лучше [знать] немногое о многом, чем многое о немногом":
https://www.osp.ru/os/2004/01/183824/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Пятница, 22 Май, 2020 02:06 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Внимательно присмотритесь к примеру. Вот часть:
Код:
void printList(List<Object> a) {
  print(a);
  a[1] = "Бу";
}
В статически типизированном языке при присваивании не может быть ошибки в исполнении - статическое соглашение выполнено. Аналогичный пример в Java работает нормально. Также в Java нельзя засунуть переменную Vector<Object> в Vector<Integer> - будет ошибка компиляции, а не времени исполнения (но можно обойти приведением для совместимости)
В Dart динамическое поведение повсюду, его легко задействовать случайно. Вы попробовали поменять "var list = <dynamic>[1, 2];" на "var list = [1, 2];", как было написано в комментарии? Смогли предсказать поведение программы?

Кстати, Вы много программировали на Dart?

Илья Ермаков писал(а):
Я не понимаю, что вы вкладываете тогда в понятие современно строго статически типизированного языка.
Да всё в контексте темы "Не могу найти дженерики". Мне важны детали, нередко считающиеся бессмысленной мелочью, но меняющие практическую суть. Уже довольно давно я размышлял, как можно совместить динамическую типизацию, построенную на основе статической, да так, чтобы было легко обмениваться между обоими мирами. И пришёл к выводу, что в такой постановке задача не бьётся, и для совмещения нужно идти с обратной стороны - в динамическую типизацию добавить возможность проверять типы статически, что приводит к необходимости к выбору, как Вы пишите, ошибочных решений - всё на динамических, но даже не так как в Java, где есть простые типы, а полностью, как в том же Dart.
Код:
func(int i) => print(i);
main() => func(null);

Нельзя считать, что на КП можно просто так взять и перенести опыт Dart в области дженериков только потому, что они якобы оба статически типизированные. Я не спорю, что для КП может быть решение, но оно будет крайне сложным, а, значит, ненужным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Пятница, 22 Май, 2020 08:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Внимательно присмотритесь к примеру. Вот часть:
Код:
void printList(List<Object> a) {
  print(a);
  a[1] = "Бу";
}



List<dynamic> у вас было.
Ну так они (правильно делают) позволяют полиморфизм по измерению "тип элементов коллекции".
Вы же сами ставите слабое ограничение - полиморфный тип элемента. Конечно, проверка откладывается на время выполнения.
У вас Ява не пропустит - и КП не пропустит - по причине того, что не дают такой полиморфизм.
Но он полезен (вот обсуждали - viewtopic.php?f=29&t=6590).

И ошибки не будет потому, что целая группа ситуаций с таким полиморфизмом (включая правильные и неправильные) до выполнения не дойдёт.

Или я не понимаю, про что Вы.

Цитата:
Кстати, Вы много программировали на Dart?


Я говорил - сам лично немного. Команда у меня работает, я на этом направлении сам к ним писать не лезу (год, 3 человека, 1 большой проект - система автоматизации центров оценки квалификации; и 4 небольших - нестандартные порталы с custom-ными CMS).
Отзывы положительные, языковых проблем не вылезает вообще. Типизация защищает, агрегатные ФП-шного стиля штуки сильно помогают на транформациях между API и GUI и т.п.

Подобные отзывы из ближнего круга разрабов слышу только об ещё одном языке -F# (по факту, это Occaml для .NET).
Go, кстати, ругают больше - волюнтаризма и самовыражения авторов в нём достаточно, что ведёт к негладкостям и странностям местами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Пятница, 22 Май, 2020 09:46 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
List<dynamic> у вас было.
Как Вы думаете, в чём разница?

Цитата:
Вы же сами ставите слабое ограничение - полиморфный тип элемента. Конечно, проверка откладывается на время выполнения.
В статически типизированном подходе не так - массив обобщённых элементов принимает любой обобщённый элемент. Поэтому он статический. А динамические проверки - это динамический подход. И это то, о чём я писал - "гиблое дело пытаться соревноваться с гибкостью динамического подхода с помощью параметризуемых, но статических типов". Также, я уже писал, что уже понял, что мы говорили об одном и том же, но с разных сторон.

Цитата:
Или я не понимаю, про что Вы.
Наверно.

Цитата:
Я говорил - сам лично немного. Команда у меня работает
Я упустил это. Значит, мне нужно было учитывать, что когда Вы говорите о качествах языка, то делаете это с позиции не тактика, а стратега.
Цитата:
Отзывы положительные, языковых проблем не вылезает вообще

А я, вот, столкнулся с проблемами, на которые пришлось плюнуть и идти другим путём. Уж не знаю, языковые ли они, но языковые тоже были. Это не связано с типизацией - для интереса, я попробовал вообще обойтись без указания типов(и я не о выводе типов). Так как задача небольшая - как раз это проблем не доставило.


Последний раз редактировалось Comdiv Пятница, 22 Май, 2020 10:30, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB