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


#1471

А как тогда будет работать что-то вроде этого?

ArrGen(100, 2000000000, x -> x + 1).Where(x -> x.IsPrime).Print;

#1472
  // отдельный класс чтоб таблицу инициализировало только при вызове IsPrime
  IsPrimeHelper = static class
    static first_before_1000: HashSet<integer>;
    
    static constructor;
    begin
      first_before_1000 := new HashSet<integer>(256);
      for var i := 2 to 1000 do
        if not first_before_1000.Any(k->i mod k = 0) then
          first_before_1000 += i;
    end;
    
  end;

function IsPrime(self: integer): boolean; extensionmethod;
begin
  if self <= 1 then exit;
  if self < 1009 then
  begin
    Result := IsPrimeHelper.first_before_1000.Contains(self);
    exit;
  end;
  
  foreach var prev_prime in IsPrimeHelper.first_before_1000 do
    if self mod prev_prime = 0 then exit;
  
  var i := 1009;
  while i * i <= self do
  begin
    if self mod i = 0 then exit;
    i += 2;
  end;
  
  Result := true;
end;

begin end.

#1473

Можно пойти ещё дальше и делители брать из таблицы. Если закончатся, добавлять новые простые числа в таблицу. Тогда должно работать очень быстро. Думаю, для integer вполне достаточно.


#1474

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


#1475

А, до меня только сейчас дошло, если инициализировать готовым списком элементов - они же всё равно загружаются в оперативную память вместе с остальной сборкой. При чём в очень не эффективном виде. Переделал, теперь таблица инициализируется алгоритмом. Не самым эффективным, потому что там не важно, его всё равно только 1 раз выполнит.


#1476

Это так и надо. Program1 - плохое имя программы. Давайте более осмысленные имена.


#1477

А можно в файл писать. Туда вообще много чисел влезет. А потом сразу файл сканировать


#1478

Надеюсь, это сейчас была шутка. Даже если не весь сканировать а сделать структуру вроде содержимого HashSet, чтоб сложность проверки была O(1) - это всё равно того не стоит.

И - лучше скажите что насчёт варианта что я предоставил.


#1479

Мы не будем делать эту функцию в стандартную библиотеку


#1480

Полагаю, что имеется вариант сделать подобные функции отдельным подключаемым модулем, подобным BlockFileOfT, поскольку PABCSystem уже перегружен - в нём имеется много различного функционала. Можно, конечно, добавлять в стандартный модуль, но в конце концов подобная стратегия приведёт к тому, что PABCSystem станет невозможно поддерживать из-за большого объема кода.


#1481

И это методически очень правильно. Ни в одном известном мне языке ядро не содержит подобных вещей - только подключаемые библиотеки. Для какого типа данных включать IsPrime? Для uint64? Чтобы числа подобного размера проверить на простоту по указанному алгоритму понадобится приличное время. И еще, почему включать IsPrime, но не включать, к примеру, IsFibonacci? IsSquare? Можно столько всего понавключать… Но не получится ли, как в известном анекдоте “… А теперь пристегните ремни, пожалуйста, и мы попытаемся со всей этой фигнёй взлететь” ?


#1482

Печально, что некоторые даже толковые выпускники школ, гимназий и лицеев не видят проблемы в том, чтобы зная число Х, написать функцию проверки на чётность квадрат этого числа …


#1483

А для чего это надо? Четность квадрата числа n совпадает с четностью самого числа n.


#1484

Решил я потестить совместимость PABCSystem с C# и вот что обнаружил… Методы, описание которых скрыто через //-- вообще не видны ни студией, ни декомпилятором. И использовать в C# их тоже не выходит.

Это баг или фича?

%D0%AB232 %D0%AB233

procedure Writeln(obj: object); и прочие с //-- недоступны. Документация ведь не должна влиять на уровень доступа?


#1486

А, разобрался. В класс PABCSystem добавляются только те методы, которые использованы в паскальном коде. Круто


#1487

Об этом уже разработчики писали, оппонируя некоторым любителям оптимизации кода. И @Admin, и @ibond.


#1488

@Admin добавьте пожалуйста строчку {$apptype windows} в снипет wf, а то не очень хорошо получается. И как я забыл добавить когда пулл для снипетов делал…


#1489

Добавил


#1490

PABCRtl.dll очень-очень крутая штука!

А можете сделать так, чтобы инициализация модулей находилась в статическом конструкторе класса модуля (к примеру, в модуле PABCSystem в типе PABCSystem.PABCSystem будет статический конструктор, вызывающий __ InitModule__)? Самому PascalABC.NET я не знаю как поможет это, но вот использовать модули паскаля на других .NET языках станет невероятно удобно!


#1491
  1. Как когда-то сказал @Admin, модули PascalABC.NET - не рассчитаны на использование вне данного языка. И я поддерживаю данную точку зрения, поскольку при использовании вне PascalABC.NETC#, например), на глаза попадаются детали реализации модулей (которые для начинающих не очевидны, и нигде не описаны).

  2. Вспоминая о том, что PascalABC.NET - учебный язык, удобнее всего использовать учебные модули, заточенные под него, на нём же, ибо, повторюсь, в PascalABC.NET это делается максимально просто, без нужды объявлять класс и метод Main, а для новичков лишние “заморочки” - не нужны.

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