Замечания и предложения

Значит, все же читают! :rofl::stuck_out_tongue_winking_eye:

Summary

Если Вы - Валерий Рубанцев, особенность ваших книг в том, что в каждой серии рассмотрены аналогичные задания на различных языках, с учётом специфики. У нас в школе была ксерокопия книги или методички, где задачи были параллельно на Бейсике, Паскале, Си, и вроде бы Фортране, а уместное сравнение всегда полезно и познавательно.

Александр, Вы правы: в идеале нужно чётко представлять и продумать весь проект используя верный подход и только чистые (“идеальные”) функции и процедуры, которые оперируют лишь параметрами, не учитывая и не изменяя внешние значения и данные.

Summary

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

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

Извините, не понял, о чем это Вы.

Раздел Const и Var, разумеется. :slightly_smiling_face:

Summary

Часто зная задачу можно лишь по количеству переменных оценить эффективность программы, а по названиями и типам переменных (и процедур / функций) - продвинутость самого автора.

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

Это что-то запредельное, для людей с экстрасенсорными способностями.

3 лайка

Я так пишу от лени.

Круто! Я вот от лени вообще никак не пишу.

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

1 лайк

Вообще программируют всё от лени делать всё руками

2 лайка

В конце-концов, неприлично делать самому то, что можно поручить другому. Даже если этот другой - компьютер.

Как насчёт добавить такую функцию в PABCSystem?:

function Distinct<T1,T2>(self: sequence of T1; selector: T1->T2): sequence of T1; extensionmethod;
begin
  var prev := new HashSet<T2>;
  foreach var a in self do
    if prev.Add(selector(a)) then
      yield a;
end;

Необходимость такая же, как у .MaxBy, то есть возможность получить результат, исходя из проекции элементов, вместо самих элементов.

Стандартный .Net-овский .Distinct выглядит примерно так же (это перевод на паскаль, но оригинальный работает точно так же):

function Distinct<T>(self: sequence of T): sequence of T; extensionmethod;
begin
  var prev := new HashSet<T>;
  foreach var a in self do
    if prev.Add(a) then
      yield a;
end;

Тогда уже DistinctBy :slight_smile: Я честно говоря не анализировал - там может быть еще много таких. MaxBy - уже невозможно было терпеть без неё.

2 лайка

Я тоже не анализировал, но .DistinctBy давно не хватало…

Сейчас по всем методам последовательностей прошёлся - не хватает ещё только .AdjacentGroupBy.
Ещё ни разу не видел применения .AdjacentGroup, а вот .AdjacentGroupBy, по крайней мере в задачках на куберфоруме - много где не хватало.

Для последнего предлагаю такую функцию:

function AdjacentGroupBy<T1,T2>(Self: sequence of T1; selector: T1->T2): sequence of (T2, List<T1>); extensionmethod;
begin
  var last: List<T1>;
  var last_key: T2;
  
  foreach var a in Self do
  begin
    var key := selector(a);
    
    if key<>last_key then
    begin
      if last<>nil then yield (last_key, last);
      last_key := key;
      last := new List<T1>;
    end;
    
    last += a;
  end;
  
end;

И дополнительный класс из реализации .AdjacentGroup не нужен. Я так понимаю вы использовали его для возможности применить .ToArray … Вот только в .ToArray тот же алгоритм добавления элементов что и у списка. Только .ToArray в самом конце создаёт ещё 1 массив, который в случае списков - не нужен.

@Admin, может сделаете метку “namespaces”? Так вам (в особенности ibond’у) будет удобнее исправлять их. Поставить эту метку нужно на эти issue:

https://github.com/pascalabcnet/pascalabcnet/issues/1977 https://github.com/pascalabcnet/pascalabcnet/issues/2024 https://github.com/pascalabcnet/pascalabcnet/issues/2025 https://github.com/pascalabcnet/pascalabcnet/issues/2026 https://github.com/pascalabcnet/pascalabcnet/issues/2064 https://github.com/pascalabcnet/pascalabcnet/issues/2065 https://github.com/pascalabcnet/pascalabcnet/issues/2066 https://github.com/pascalabcnet/pascalabcnet/issues/2071 https://github.com/pascalabcnet/pascalabcnet/issues/2073

Сделал

1 лайк

В GraphWPF нету ничего типа GetPixel[s]. Единственная подпрограмма, как то считывающая содержимое окна - Window.Save. Как то не хорошо, ради считывания области окна - обязательно использовать файл на диске.

Можете, пожалуйста, сделать что то типа GetPixels, считывающего Array[,] of Color?

К сожалению, в WPF такого нельзя сделать. Я исследовал этот вопрос. Я рисую не пиксели на экране - я рисую графические примитивы. И хранятся они до поры как графические примитивы

Ну всё окно то вы в файл сохраняете как то.

Посмотрите на строчку 1324 в GraphWPF. Похоже - именно она берёт пиксели из готового окна и превращает в содержимое битмапа. Вот таким же образом но не в файл - а в оперативную память перекинуть бы…

Среда умирает от подключения PABCRtl32:
https://youtu.be/4ifCVJF-kUo