MSElang : обсуждение фишек

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Re: MSElang : обсуждение фишек

Сообщение mse » 27.11.2013 12:35:19

@Mikhail
If I understand correct you suggest to replace 'while do', 'repeat until' and 'for in' by a single 'loop' construct (please correct me if I am wrong). I don't like it because of MSElang design goal 2. 'while do' and 'repeat until' 'for in' clearly state the intention. With a single 'loop' construct on has to scan the code for break and continue statements in order to understand the functionality.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 12:50:28

Операторы BREAK и CONTINUE - это самое лучшее решение, т.к. ограничены варианты перехода, и сам оператор определяет куда будет осуществлен переход.

Ессно, имелся ввиду перескок уровней (shift >0).

'while do' and 'repeat until' clearly state the intention

These may really be combined ( only differ by "pre" & "post" meaning). But it hadly worths for the 'For'.

Добавлено спустя 4 минуты 23 секунды:
правильное понимание оператора GOTO нужно очень много времени. Производительность труда падает в разы

По факту джапмы будут изолированы в теле функции.

ПС: Привыкайте :) Именно так (принимая в расчет даже парадоксы) Мартин постепенно приходит к идеальным решениям :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение Mikhail » 27.11.2013 13:22:17

mse писал(а):@Mikhail
If I understand correct you suggest to replace 'while do', 'repeat until' and 'for in' by a single 'loop' construct (please correct me if I am wrong). I don't like it because of MSElang design goal 2. 'while do' and 'repeat until' 'for in' clearly state the intention. With a single 'loop' construct on has to scan the code for break and continue statements in order to understand the functionality.


Вы поняли неправильно.

Циклы (структурные) while, repeat, for остаются, но запрещается их досрочное завершение. Одна точка входа и одна точка выхода.

Дополнительно, вводится (неструктурный) цикл "loop end". Выход из цикла осуществляется с помощью операторов break. Это цикл общего вида, позволяющий реализовать такие конструкции как "цикл с выходом из середины", "цикл с несколькими выходами" и т.п.

Сейчас, если нужен цикл с несколькими выходами, я пишу так

Код: Выделить всё
while true do begin
...
if curpos = bufsize-1 then break; //конец буфера
...
if compare(elem, curpos) then break; //элемент найден
...
end;


В циклах while, repeat, for я не применяю break. В моих программах если нет строки "while true do", то гарантированно выход в цикле один, но лучше иметь гарантию со стороны языка, чем со стороны программиста. Такой подход улучшает семантику циклов, упрощает поиск ошибок и написание "assert".
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 14:03:12

Циклы (структурные) while, repeat, for остаются, но запрещается их досрочное завершение. Одна точка входа и одна точка выхода.

Думаю, это слишком строго. Выход из цикла соответствует мыслительной конструкции - принадлежащей реальному (естественному) миру. По этой же причине FOR (дискрет) всегда отделен от прочих циклов, даже в PL/PosgreSQL -в котором DO/WHILU/REPEAT (недискреты) реально объединены в одну LOOP.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение Mikhail » 27.11.2013 14:13:14

debi12345 писал(а):Думаю, это слишком строго. Выход из цикла соответствует мыслительной конструкции - принадлежащей реальному (естественному) миру. По этой же причине FOR (дискрет) всегда отделен от прочих циклов, даже в PL/PosgreSQL -в котором DO/WHILU/REPEAT (недискреты) реально объединены в одну LOOP.


Я считаю что у каждой конструкции должна быть четко выраженная семантика.
while - структурный цикл с предусловием.
repeat - структурный цикл с постусловием.
for - структурный цикл с фиксированным числом повторений.
loop - неструктурный цикл общего вида.

Использование операторов досрочного выхода разрушает семантику структурных циклов и сводит их ценность почти к нулю.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 14:23:13

while - структурный цикл с предусловием.
repeat - структурный цикл с постусловием. => LOOP POSTCHECK
loop - неструктурный цикл общего вида.

Можно и объединить в одно :
Код: Выделить всё
LOOP [PRECHECK|POSTCHECK [WHILE <cond>]] DO
[..]
END;

Один фиг "REPEAT .. UNTIL" не кричит о своей POSTовости, то есть без разницы куда вписывать проверку
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение Mikhail » 27.11.2013 14:31:54

debi12345 писал(а):Можно и объединить в одно :


Можно, но ИМХО, не нужно. Опять же, для "чистого" loop можно сделать выход через несколько уровней с помощью необязательной метки. goto, кстати, тоже надо запретить внутри структурных циклов и, возможно, даже внутри loop-а.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 14:40:15

goto, кстати, тоже надо запретить внутри структурных циклов и, возможно, даже внутри loop-а.

Ну и как тогда перейти на 2+ уровень цикла выше ? Или выйти на 2- уровня ниже ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение Mikhail » 27.11.2013 14:43:37

Идея для цикла с постусловие писать это условие вначале имеет право на жизнь, хотя и дискуссионна.

Добавлено спустя 2 минуты 13 секунд:
debi12345 писал(а):Ну и как тогда перейти на 2+ уровень цикла выше ? Или выйти на 2- уровня ниже ?


Выше (внешние циклы) с помощью break. Ниже не нужно. А если ну очень нужно то можно сделать все на goto, включая и сами циклы. Ведь goto не запрещен сам по себе.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 15:24:06

Выше (внешние циклы) с помощью break. Ниже не нужно. А если ну очень нужно то можно сделать все на goto, включая и сами циклы. Ведь goto не запрещен сам по себе.

То есть нынешнее состояние ФПЦ. Правда без EXIT, и с зачморённым RETURN :)

Идея для цикла с постусловие писать это условие вначале имеет право на жизнь, хотя и дискуссионна.

Ага, потому что по синтаксису "REPEAT .. UNTIL" тоже сразу однозачно не скажешь что он POST. Что и позволяет выполнить унификацию :)

Добавлено спустя 6 минут 39 секунд:
Возможен и микс :
Код: Выделить всё
LOOP [WHILE <cond>] DO
[..]
END;

и
Код: Выделить всё
LOOP  DO
[..]
END [WHILE <cond>];
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение Mikhail » 27.11.2013 15:32:18

debi12345 писал(а):То есть нынешнее состояние ФПЦ. Правда без EXIT, и с зачморённым RETURN :)


Exit это и есть Return.

debi12345 писал(а):Ага, потому что по синтаксису "REPEAT .. UNTIL" тоже сразу однозачно не скажешь что он POST. Что и позволяет выполнить унификацию :)


Это почему? Увидел слово repeat и сразу ясно что это цикл с постусловием. Другое дело что условие находится в конце тела и его может быть не видно, если тело длинное. И читает человек (парсер тоже) сверху вниз. Например при изучении компилятора FPC не раз сталкивался с такими конструкциями
Код: Выделить всё
repeat
...
until false;


Тело циклов иногда занимало несколько сот строк и догадаться что это бесконечный цикл можно было только пролистав до конца. Почему разработчики не написали эквивалентный, но более понятный
Код: Выделить всё
while True do begin
...
end;

для меня загадка.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 16:15:10

Это почему? Увидел слово repeat и сразу ясно что это цикл с постусловием.

Нифига не ясно.

while True do begin
...
end;

Слышен топот "LOOP POSTCHECK ... DO .. END;" :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение alexey38 » 27.11.2013 16:43:19

debi12345 писал(а):MSEide... MC через Telnet/SSH,..

Зачем? Почему не работать на основном компе? Почему не переносить исходники через SVN или GIT?
На удаленном конце только обновление из репозитория и Make. Все. При таком подходе, у Вас на руках всегда есть исходники (даже если сломался канал связи), т.е. Ваша работа не останавливается при неполадках со связью. У Вас формируется пошаговая история изменений, соответственно Вы не рискуете что-то случайно испортить. Всегда есть возможность на удаленной машине собрать стабильный релиз (прошлый), если Ваша сегодняшняя работа не завершилась успехом, а рабочий день закончился (например, Вы в командировке и Вам нужно ехать на вокзал или в аэропорт).
Mikhail писал(а):Мартин еще раз вношу предложение по циклам.
3 структурных цикла while, repeat, for, т.е. только один вход и один выход (запрещены break, continue, exit, и т.п.). И один бесструктурный loop end, это бесконечный цикл выход с помощью оператора break. Дополнительно для выхода из вложенных циклов можно сделать специальную метку, например

Конечно решать Мартину, но я считаю Ваше предложение просто недопустимым.

Во-первых, нарушается преемственность с Паскалем, причем там, где вообще все хорошо и нет ни каких проблем.
Во-вторых, четкие и логичные конструкции циклов и ясными операторами управления циклом, Вы заменяете на какие-то достаточно дурацкие, особенно "бесструктурный loop end", который сам по себе является скорее логической ошибкой, чем нужным оператором. А предложение "выхода из вложенных циклов можно сделать специальную метку" - это вообще ересь.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: MSElang : обсуждение фишек

Сообщение debi12345 » 27.11.2013 16:48:23

Exit это и есть Return.

Исключительно для обслуживания процедур (RETUEN без значения) ? Тогда точно в топку :)

Почему не переносить исходники через SVN или GIT?

Чтобы не ставить на рутер GIT-сервер. Вы бы своему нетворк-админу это разрешили бы ? Вот то-то :)
И даже в случае GIT-клиента на рутере... Толку собирать и тестировать на локальной машине если у рутера свои настройки доступа в сеть (недоступные локальной машине) ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: MSElang : обсуждение фишек

Сообщение alexey38 » 27.11.2013 17:01:28

Mikhail писал(а):Я считаю что у каждой конструкции должна быть четко выраженная семантика.
while - структурный цикл с предусловием.
repeat - структурный цикл с постусловием.
for - структурный цикл с фиксированным числом повторений.
loop - неструктурный цикл общего вида.
Использование операторов досрочного выхода разрушает семантику структурных циклов и сводит их ценность почти к нулю.

Вы слишком увлекаетесь формальным подходом. Вместо дела, Вы радеете за абстрактную красоту кода. Такой код будет красив, но неприменим в реальных задачах.
debi12345 писал(а):Ессно, имелся ввиду перескок уровней (shift >0).

Я, например, считаю это признаком плохого алгоритма. Такое лучше не применять. А там, где все таки очень нужно, там нужно применять Exit, т.е. ясность кода обеспечивается правильной структуризацией.

Мне кажется, что все Ваши предложения и предложения Михаила вызваны тем, Вам в Вашей практике мало приходилось работать с чужим кодом (написанным не Вами), либо с Вашим кодом, написанным лет 10-20 назад.
Хорошо написанный чужой код Вы должны понять сходу, на читая документации, и даже не зная заранее, что вообще выполняет этот код (какую он решает задачу). Хороший код, он как хорошая книга, читаешь и понимаешь все сходу.

Так вот, перескоки через уровни - они вводят в ступор. Приходится притормаживаться и разбираться куда конкретно перепрыгиваем, и почему мы перепрыгиваем.

Цель хорошего языка программирования - это не ускорение процесса первичного кодирования. Т.к. профессионал набивает текст в несколько тысяч знаков в минуту. И код в 1000 строк пишется за час, вместе с первичной отладкой. Смысла нет ускорять этот процесс, я например, пишу программу быстрее, чем успеваю думать (разрабатывать).

Цель хорошего языка программирования - это кардинальное упрощение процесса отладки (особенно комплексной), и сокращение трудозатрат в десятки или сотни раз на сопровождение проекта. У нас например, считается, что баг в чужой программе (которую практически не знаешь) нужно исправить не более, чем за 1 час. Плохо написанный код при сопровождении требует огромных трудозатрат, и любой такой проект умирает, т.к. ни один заказчик не может (не будет) платить огромные деньги (программист тоже хочет кушать) за бесконечную отладку и за глюки.

Добавлено спустя 10 минут 3 секунды:
debi12345 писал(а):Чтобы не ставить на рутер GIT-сервер. Вы бы своему нетворк-админу это разрешили бы ? Вот то-то
И даже в случае GIT-клиента на рутере... Толку собирать и тестировать на локальной машине если у рутера свои настройки доступа в сеть (недоступные локальной машине) ?

Но Вы же смогли соединиться с удаленной машиной? Значить и пакеты ходят в обе стороны. А раз пакеты ходят в обе стороны, то и доступ к Вашему GIT или SVN серверу есть с удаленной машины. Прописывайте маршрут (если с удаленной машины инет не виден) и в путь. А если на удаленной машине есть инет, то вообще нет проблем (все работает само по себе). В любом случае, удаленная машина - это не случайный комп, это комп, где Вы внедряете задачу. А если Вы еще и там собираете, то там в любом случае стоят куча Вашего софта (компилятор, библиотеки и т.п.).

На своей машине можно не тестить, а компиляция - это как минимум проверка синтаксиса, да и собрать на своей тоже хорошо. Своя машина - это полноценный набор инструментов для разработки. Вы же сами указываете, что не можете запускать полноценные RAD на удаленной машине.
Вы похоже сами выдумали себе мазохистские проблемы, которые затем героически решаете.
debi12345 писал(а):Исключительно для обслуживания процедур (RETUEN без значения) ? Тогда точно в топку

В классическом паскале есть EXIT, а не RETURN. А для функций есть Result.
Не нужно без необходимости ломать паскалевский диалект. EXIT и Result - прекрасно работают. Вообще без нареканий.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Пред.След.

Вернуться в MSEide + MSEgui

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru