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

Ну так, добавлять всё на главную просто не хватит места! P. S. А справку-то исправить нужно, помогает иногда.

По-моему, правильно делают. Срезы - существенное расширение языка. А сообщение на официальном сайте типа “В Справке исправлена неточность для …” - это смешно.

Можно ли поменять цвет ключевых слов (begin, end и т.д.) с чёрного на зелёный?

Можно поменять в файле

C:\Program Files\PascalABC.NET\Highlighting\PascalABCNET.xshd

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

1 лайк

Как-то замешалось среди прочих без отзывов мое предложение, поэтому рискну повторить (с изменениями).

Предлагается достаточно эффективная возможная реализация.

procedure SortByRow<T>(a:array[,] of T; row:integer; descending:boolean:=False);
begin
  var b:=descending ?
    a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0])
      .Select(q->q[1]).ToList :
    a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0])
      .Select(q->q[1]).ToList; 
  for var i:=0 to a.ColCount-2 do begin
    var j:=b[i];
    a.SwapCols(i,j);
    b[b.IndexOf(i,i)]:=j;
    end
end;

begin
  var M:=MatrRandom(5,6,1,9);
  M.Println(2);
  Writeln(2*M.ColCount*'-');
  SortByRow(M,2,True);
  M.Println(2)
end.

Красиво получилось, а самое главное-с разноцветным кодом работать гораздо удобнее. :wink:

Можете пожалуйста добавить возможность получать указатель на функцию как то так:

function f1:byte := 0;

begin
  var o := @f1;
end.

Вместо:

function f1:byte := 0;

begin
  var o:function():byte := f1;
end.

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

Уберите пожалуйста из Ctrl+Space overload. Компилятор его конечно поддерживает, но использовать его когда пишешь на PascalABC.Net нет смысла. Зато из за него надо набирать overr вместо ov чтоб Ctrl+Space правильно подсказал override.

1 лайк

А мы не забыли, что еще есть такая вещь, как совместимость с прежними версиями? Разумно ли удалять ключевое слово вообще из-за лени отдельных индивидуумов пару раз набрать на 4 символа больше? Т.е. в угоду одному человеку лишить большую аудиторию поддержки совместимости? Может давайте все же почаще помнить об обществе, а не стремиться переделать проект под свои личные нужды?

Я не сказал удалить его вообще, я сказал убрать из Ctrl+Space, потому что печатать его нет смысла.

Неправ был :confused:, я почему-то воспринял это как призыва, убрать override в угоду дельфийскому overload. Override? Ocerride конечно, чаще встречается.

Возвращаясь к старому вопросу: а можно как-нибудь “безболезненно” расширить пространство имён в repeat until, чтобы из выражения в until было видно то, что между repeat и until?

1 лайк

Нет

В смысле, если я опишу там что-то в var, или поставлю begin … end, увидеть это за пределами тела цикла? Это же нарушение всех принципов видимости.

Видимо имелось в виду что переменная из заголовка цикла будет видна в его теле. Только в for заголовок в начале цикла, а в repeat until в конце. Из за этого не удобно потому что, получается, переменная используется на строчках раньше объявления и отсюда же путаница типо просьб сделать это рабочим:

repeat
  var i := 5;
until i=0;

Хотя для того чтоб не нарушать принципы видимости - надо что то типа такого:

repeat
  i-=1;
until var i := 5 = 0;

Но опять же, тут полно проблем. То что переменная используется до объявления - в длинных программах будет путать, ещё = сразу после var, нигде в паскале такого больше нет. И что должно делать с переменной в первой итерации цикла, когда i ещё не объявлена? В while добавить возможность объявления переменных в заголовке - и то логичнее было бы.

А не надо чересчур эстетствовать! Если “религия не позволяет” определить переменную выше repeat и потом убрать ее, присвоив ‘nil’, то с этим лучше к врачу по соответствующему профилю.

1 лайк

Но, но… Инкапсуляция… :persevere:))))

Без всяких begin end. Там был такой пример

procedure IOStandardSystem.readln;
begin 
 Repeat
  var sym := CurrentIOSystem.read_symbol;
 Until (sym = END_OF_LINE_SYMBOL) or (sym = char(-1)) 
end;

Так выдаст ошибку. Надо sym заранее описывать, но так как это не рекомендуется, например в PABCSystem.pas тоже самое делается через замену repeat на while

procedure IOStandardSystem.readln; 
begin
  while True do
  begin
    var sym := CurrentIOSystem.read_symbol;
    if (sym = END_OF_LINE_SYMBOL) or (sym = char(-1)) then
      exit;
  end;
end;

Хотелось бы избежать таких конструкций. Возник вопрос, а нельзя ли сделать общую область видимости на всю Repeat Until. Но там, похоже, какая-то нетривиальная проблема в стиле того, что вообще понимается под определением переменной. Где-то недавно была статья по этому поводу.

— Но, но! Без рук! Я на вас буду жаловаться в Сфатул-Церий, в Большой Хурулдан!

(И.Ильф, Е.Петров. “Золотой теленок”)

Это где не рекомендуется? “В Европе и в лучших домах Филадельфии”, где модно разливать чай через ситечко ? Это аргумент уровня “людоедки Эллочки”.

Где рекомендуется? http://pascalabc.net/downloads/Presentations/PABC.NET_vs_Pascal_2016.pdf "Временные переменные описывать внутри блока." Я тоже это не вполне понимаю. PS. Я просто пытаюсь объяснить, почему сделано через while.