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

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

ArrGen(100, 2000000000, x -> x + 1).Where(x -> x.IsPrime).Print;
  // отдельный класс чтоб таблицу инициализировало только при вызове 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.
2 лайка

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

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

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

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

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

1 лайк

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

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

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

2 лайка

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

1 лайк

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

1 лайк

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

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

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

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

%D0%AB232 %D0%AB233

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

1 лайк

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

2 лайка

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

1 лайк

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

1 лайк

Добавил

3 лайка

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

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

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

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

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