Шаг для цикла For


#1

Привет! Термоядерный язык PascalABC использующий компоненты NET Framevork. Раз язык на столько гибридный и современный то почему в цикле For нет возможности создать шаг, по типу For var i:=1 to i<9 do step(i+2) begin end; Возможно есть возможность но я ее не нашел…Другие циклы другая тема, Благодарю.


#2

Возможно потому, что он все же где-то по-прежнему Паскаль. В коем цикл со счетчиком for имеет инкремент/декремент, равный единице. Если в Паскаль начать тянуть все конструкции из иных языков, это уже будет вообще некий монстр. А то, что Вы пишете - это когда-то было в языке PL/1. И вызывало множество критики, кстати.


#3

вообще то цикл For придумал не Pascal и к примеру Pascal DOS шаг можно было организовать внутри цикла, For i:=1 to 10 do begin i:=i+2; end; так что не нужно ограничивать, достойный язык, Лично мне он нравится своей чистотой оформления, а не ограниченностью. Ну и если следовать вашей логике, то зачем определять переменные внутри тела программы, ведь это тоже отличия Pascal… Шаг просто обязан быть в это цикле, я его использовал еще в синклеар бейсике в 1993 году…))))))))))))))))))


#4

В принципе, идея хорошая, но вот реализацию нужно продумать. То есть сохранить как стандартный For Var… , так и новый. Может синтаксис For Var i:=0 to 20 step 2 do будет более “Паскалевским” и лучше впишется? Не нежно опускать Паскаль до ущербного C++!!!


#5

не будем дискутировать на тему с++, я языками не пренебрегаю. А, вот (For Var i:=0 to 20 step 2 do) замечательно выглядит! и если вы ее реализуете я лично буду в восторге…))))))))


#6

Оно совершенно не нужно, потому что есть Range ( начало, конец, [шаг=1] ), генерирующий любые последовательности. И есть ArrGen / MatrGen, генерирующие элементы массивов как функцию последовательно перебираемых индексов.


#7

А может от от foreach var i in Range(0,20,2) do Вы станете чуточку счастливее?

Чисто технически: ключевое слово step рубит в окрошку все наши стандартные библиотеки :frowning:


#8

Нежные так не поступают! =3

Та да, когда речь заходит о С++, нежные тут же достают портативный фекаломет =3

Представляю, сколько кода, уже написанного, испортится, если добавить настолько популярное ключевое слово =3


#9

Можно в принципе шаг задавать ключевым словом BY, как было в PL/1. Но это, наверное, можно сделать, когда больше заняться нечем.

Как насчет этого?

function Step(Self: integer): sequence of integer; extensionmethod; Возвращает бесконечную последовательность целых от текущего значения с шагом 1 function Step(Self: integer; step: integer): sequence of integer; extensionmethod; Возвращает бесконечную последовательность целых от текущего значения с шагом step function Step(Self: real; step: real): sequence of real; extensionmethod; Возвращает бесконечную последовательность вещественных от текущего значения с шагом step


#10

Тогда уже function Iterate<T>(Self: T, function(T):T): sequence of T Возвращает бесконечную последовательность рекуррентного применения функции к значению - можно таким образом и Step сделать, и простые задачи с первого курса порешать.

Чего мелочиться =3

Числа Фибоначчи: (1, 2).Iterate((a, b)=>(b, a+b)). [или как там в Паскале лямбды пишутся]


#11

Вообще-то я примеры привел из Справки, где задействован Step


#12

Тогда я неправильно понял.=3


#13

Собственно о PABCSystem где-то уже где-то говорили… В чём заключается проблема? Стандартный For Var ведь не предлагается убрать, а лишь добавить его вторую версию. А ключевые слова ведь можно использовать с &? Var &step: int32;?


#14

Это не мой пост был, это @Admin


#15

Это будет даже хуже, чем “Сишный” вариант…


#16

Извиняюсь…


#17

Почему? В Паскале нет ни Step, ни By, какая разница, какое слово использовать? Оно лично Вам не нравится? Ну так каждому что-то нравится больше, что-то меньше.

Н.Вирт вообще пошленько поступил. Он Паскаль создавал на базе Алгола, там был цикл for i:=m step h until n do Он выбросил STEP, а UNTILl заменил бейсиковским/фортранным/PL/1-ским TO


#18

Step-англ. Шаг; By-англ. От. Step здесь больше подходит. Конструкция вида For Var i:=0 to 6 by 2 do немного смущает… Кроме того по поводу конструкции из PL/1 уже высказывались, причём Вы, так что это не только моё личное мнение:


#19

Да ладно Вам! Создателей PL/1 - а это был целый комитет - почему-то оно не смущало. Уверен, английский язык они знали лучше Вас)). BY - это вовсе не “от”, которое по-английски FROM.


#20

Вирт поступил правильно. Ни один из этих трёх легендарных циклов нельзя удалять или менять. Цикл for i:=m step h until n do вам не напоминает for(i=0; i<4; i++)? Тогда можно вообще перестать писать на Паскале, есть C# со всеми этими конструкциями.