Помощь новичкам

Александр, речь о разорванных" строках таких как:

Также есть ли способ или директива

управления компиляцией, например,

временно отключить (для определённой

программы) Debug ?

Интересует компактное решение в неофункциональном стиле.

Отключить или включить режим Debug - нельзя, но можно узнать включён ли он или нет. Пример из справки:

{$define DEBUG} 
begin
  {$ifndef DEBUG}
  Writeln('Имя DEBUG не определено');
  {$else} 
  Writeln('Имя DEBUG определено');
  {$endif}
end.

Правильно ли я понимаю, что если после NewLine не следует прописной буквы, NewLine надо заменить пробелом?

Александр, всё верно.

MrFresnel, возможно, я просмотрел, но не заметил, чтобы {$define DEBUG} или {$define DEBUG=off} как-то влияла на состояние галочки “Генерировать отладочную информацию”.

Обновил сообщение выше - извиняюсь за ошибку.

Попробуйте так:

begin
  WriteAllText('TestMod.txt', ReadAllText('Test.txt')
      .RegexReplace('\r\n([^A-ZА-ЯЁ])',' $1'))
end.

Если файл линуксовый, уберите из шаблона \r

Если в файле есть пустые строки, вызовите дважды, указав выходной файл первого прогона в качестве входного: он будет перезаписан.

Если заведомо известно, что пустые строки есть, можно так:

begin
  var s := ReadAllText('Test.txt');
  while s.MatchValue('\r\n[^A-ZА-ЯЁ]') <> '' do
    s := s.RegexReplace('\r\n([^A-ZА-ЯЁ])',' $1');
  WriteAllText('TestMod.txt', s)
end.
2 лайка

Я тут подумал - нехорошо пустые строки так удалять, потому что каждая пустая будет пробелом замещаться. Но можно предварительно пройти файл построчно с использованием ReadLines( ) и переписать из него непустые строки.

@Admin а вообще это должно работать? Потому что $define и $undef не работают на DEBUG, от слова вообще. Может реализуете что это действительно переключало режим компиляции, чтоб не лезть каждый раз в настройки?

Если и реализовывать переключение настроек директивами, то делать это для всех настроек. Иначе по какому принципу они отбираются? Реализовывать только для DEBUG не вижу смысла. Может, стоит тогда сделать конфигурации компиляции для файлов (?) и проектов, по аналогии с Visual Studio? Но, насколько это будет востребовано? Я против того, чтобы из-за моей (!) ошибки разработчики исправляли свой проект, только ради того чтобы моя ошибка переставала быть ошибкой.

Значит, это моя ошибка, а не повод реализовывать очередной функционал.

В настройках есть пункт “Генерировать отладочную информацию” - это Debug. Надо понимать, что если программа запускается в режиме связи с оболочкой, то всё равно будет Debug.

По поводу констант вида {$define DEBUG} необходимо понимать, что они распространяются только на один .pas-файл. То есть, если его определить в модуле, он не будет действовать в основной программе. Вы же хотите глобальные константы. Такого функционала нет.

3 лайка

Чувствую сейчас последует просьба добавить директиву GLOBAL_CONSTS, или пункт Включить глобальные константы в настройки…

Число Авогадро, радиус Земли и постоянную Планка?

Запустил PascalABC.NET с правами администратора, добавил функционал в PABCSystem:

type
  ArrayOf<T> = array of T;
  MatrixOf<T> = array [,] of T;
  
  ns = static class
  public
    static function GArray<T>(count: integer;
      selector: integer -> T;
      firstIndex: integer := 0) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, selector, firstIndex);
  
    static function GArray<T>(count: integer;
      first: T;
      next: T -> T) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, first, next);
  
    static function GArray<T>(count: integer;
      selector: (ArrayOf<T>, integer) -> T) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, selector);
  end;

Попытался использовать из программы:

begin
  ns.GArray(10, x -> x).Println();
end.

, Intellisence - нормально реагирует на добавленный функционал - он его видит, но компилятор выдаёт ошибку:

Program1.pas(3) : ns не объявлен в пространстве имен PABCSystem

@Admin, как правильно пополнять функционал PABCSystem, чтобы им можно было без проблем пользоваться?

Надо проверить, не включено ли ускорение из под оболочки.

Кроме того, надо перегенерировать все pcu

1 лайк

@Admin, как это сделать, если не вручную? Встроенные средства имеются?

Встроенные средства имеются в репозитории. В готовый пакет такое не добавляется и не должно.

Здравствуйте. А есть ли функционал для сравнения двух динамических массивов на равенство (или неравенство) содержимого?

begin
  var a := Arr(1, 2, 3);
  var b := Arr(1, 2, 3);
  Println(a = b);  // False
 // понятно объекты разные, а как сравнить на содержимое?
end.

Навскидку:

begin
  var a := Arr(1, 2, 3);
  var b := Arr(1, 2, 3);
  ((a.Length = b.Length) and a.Zip(b, (p, q) -> p=q).All(p -> p)).Println
end.

a.SequenceEqual(b)

А если нужна скорость - лучше комбинировать:

(a.Length = b.Length) and a.SequenceEqual(b)

Потому что .SequenceEqual эффективнее сравнивает отдельные элементы.
Но при этом длины массивов сравниваются только после проверки всех элементов на равенство, хотя длины это то, что проще проверить и обычно чаще отличается.