Не доводит лень до добра или Опять ленивые вычисления?
// PascalABC.NET 3.2, сборка 1399 от 08.03.2017
begin
var St:=new stack<char>;
'12345'.Foreach(e->St.Push(e));
var tmp:=new stack<char>;
repeat
tmp.Push(St.Peek); St.Pop;
until (St.Count=0) or (St.Peek=tmp.Peek);
tmp.Println
end.
Тут все хорошо и получаем вывод 12345.
Но стоит поменять местами термы логического “ИЛИ” в until…
begin
var St:=new stack<char>;
'12345'.Foreach(e->St.Push(e));
var tmp:=new stack<char>;
repeat
tmp.Push(St.Peek); St.Pop;
until (St.Peek=tmp.Peek) or (St.Count=0);
tmp.Println
end.
Это самое. Виноват, конечно, Периодически забываю, что в этой версии Паскаля в логических выражениях может вычисляться только часть (до первого true в дизъюнкции или до первого false в конъюнкции). Допустил ляп с контролем стека и он прошел из-за этих самых “сокращенных”.
Т.е. надо было делать примерно так:
begin
var St:=new stack<char>;
'123345'.Foreach(e->St.Push(e));
var tmp:=new stack<char>;
repeat
tmp.Push(St.Peek); St.Pop;
if St.Count=0 then break
until St.Peek=tmp.Peek;
tmp.Println
end.
P.S. А мастера никто и не обвинял. Как часто бывает в первый момент ,когда “не клеится”, был виноват весь мир. Кроме себя, естественно. Пока не “отпустит” и не поймешь, что виноваты, как чаще всего бывает, собственные кривые ручонки.