Ну так, добавлять всё на главную просто не хватит места! P. S. А справку-то исправить нужно, помогает иногда.
По-моему, правильно делают. Срезы - существенное расширение языка. А сообщение на официальном сайте типа “В Справке исправлена неточность для …” - это смешно.
Можно поменять в файле
C:\Program Files\PascalABC.NET\Highlighting\PascalABCNET.xshd
Открывать его любой текстовой читалкой. Но при каждом обновлении этот файл будет сбрасываться на стандартное значение.
Как-то замешалось среди прочих без отзывов мое предложение, поэтому рискну повторить (с изменениями).
Предлагается достаточно эффективная возможная реализация.
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.
Можете пожалуйста добавить возможность получать указатель на функцию как то так:
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
.
А мы не забыли, что еще есть такая вещь, как совместимость с прежними версиями? Разумно ли удалять ключевое слово вообще из-за лени отдельных индивидуумов пару раз набрать на 4 символа больше? Т.е. в угоду одному человеку лишить большую аудиторию поддержки совместимости? Может давайте все же почаще помнить об обществе, а не стремиться переделать проект под свои личные нужды?
Я не сказал удалить его вообще, я сказал убрать из Ctrl+Space, потому что печатать его нет смысла.
Неправ был , я почему-то воспринял это как призыва, убрать override в угоду дельфийскому overload. Override? Ocerride конечно, чаще встречается.
Возвращаясь к старому вопросу: а можно как-нибудь “безболезненно” расширить пространство имён в repeat until, чтобы из выражения в until было видно то, что между repeat и until?
Нет
В смысле, если я опишу там что-то в 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’, то с этим лучше к врачу по соответствующему профилю.
Но, но… Инкапсуляция… ))))
Без всяких 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.