Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, VladD2, Вы писали:
VD>>А самих "use cases for else" там нигде не приводится? А то у меня складывается ровно противоположенное мнение о них. Сдается мне, что как раз они редки и без них не так уж и неуклюже.
CS>
CS>for( var ... in ...) ... otherwise ...;
CS>
CS>(в моем случае) имеет смысл именно для случая for( var ... in ...) что есть перебор последовтельности с пом. итераторов/генераторов — т.е. когда длина последовательности неизвестна заранее. CS>Для переборов реальных коллекций как правило есть достаточно дешевые способы сказать нечто типа этого: CS>
CS>if( arr.length )
CS> for ( var el in arr ) ...
CS>else
CS> ...;
CS>
Я вижу ты тоже не знаешь как работает for/else в питоне. Питоновская версия for/else-а аналогична вот такому коду:
isBreakerd = false;
for el in arr:
...
if something:
isBreakerd = true;
break
...
if isBreakerd: ... # выполняем else-действия
А то что демонстрируешь ты к питону не имеет никакого отношения.
Меня же интересует именно питоновское поведение (которое мне каежся не интуитивным).
CS>Заведение счетчиков-флагов: CS>
CS> var count = 0;
CS> for ( var el in arr )
CS> {
CS> ++count;
CS> ...
CS> }
CS> if(!count)
CS> ...
CS>
CS>не так эффективно да и некрасиво.
Ага. И к делу не имеет никакого отношения .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Temoto, Вы писали:
T>Если бы я был дизайнером языка, то сделал бы else как в шаблонизаторе, для случая пустого списка.
T>У тебя в Nemerle это ведь можно сделать макросом, правильно? Я не думаю, что о каждом мелком синтаксическом расширении знать надо всем.
Собственно я сюда и полез потому как в немерле это сделали макросом. Но по началу сделали по наитию, и получилось именно как в шаблонизаторе. Против этого я ничего не имел. Разве что не видел в этом реальной необходимости.
Так вот у меня зародилось смутное сомнение в том, что это вообще надо. Мне все больше и больше кажется, что фича (по крайней мере в питоновском виде) совершенно надуманная, по крайней мере в контексте Немерла. Вот я и решил узнать мнение людей реально использующих Питон на практике.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
E>>Лично я не считаю, что она мешает в Питоне, но и в случае её исчезновения не сказать, что буду сильно страдать.
VD>Ага. Спасибо! Вот именно это мне и нужно было узнать.
E>>Так, иногда скучал бы... Всё-таки это одна из тех мелких необязательных фишек, которые делают процесс E>>повседневного кодирования чуточку ярче
VD>К сожалению — это и одна и сторон которая делает язык чуточку сложнее для изучения. По сему это палка о двух концах.
Если честно, то в данном вопросе мне больше нравится методы литературного программирования. Вместо того, чтобы плодить разные конструкции (c целью избежать goto и/или лишней заморочки с флашами) и думать, как из обозвать, я могу записать примерно так
@ Общая схема чтения конфигурационного файла
@d config_file_error = goto config_file_error_label
@<Чтение конфигурационного файла@> =
foreach item in Configuration file { Типа псевдокода }
@<Обрабатываем строку конфигурационного файла@>
@<Последние штрихи к обработке@>
goto finalization;
config_file_error_label:
@<Обработка случая, когда в конфигурационном файле найдена ошибка@>
goto finalization;
finalization:
<@Финализируем обработку файла@>
@ Обработка одной строки конфигурационного файла
@<Обрабатываем строку конфигурационного файла@> =
код...
I even wonder if else-clauses on for/while were a good idea. (The one
E>on try is definitely a good idea since the use case is quite frequent
E>and only clumsily handled otherwise; the use cases for else on
E>for/while are less convincing IMO.)
Здравствуйте, VladD2, Вы писали:
VD>Так вот у меня зародилось смутное сомнение в том, что это вообще надо. Мне все больше и больше кажется, что фича (по крайней мере в питоновском виде) совершенно
надуманная, по крайней мере в контексте Немерла. Вот я и решил узнать мнение людей реально использующих Питон на практике.
Как по мне, общее развитие ситуации такое: много лет назад Дейкстра заклеймил goto. В результате структурное программирование без использования goto пошло в массы. Потом, однако, выяснилось, что несмотря на то, что любой код с использованием goto можно переписать без использования оного, но в ряде случае это приводит к лишнему геморрою и запутыванию в виде дубрирования кода или введения хитрых флажков. Поэтому началось медленное движение в направлении того, чтобы формализовать часто используемые goto в виде новых конструкций языка. Таким образом, вроде как и не goto Поэтому появились всякие break и continue, потом именованные циклы. Ну и вот сейчас очередной пример в Питоне, может и с не совсем удачным названием.
Если говорить обо мне, то код в перед break таки действительно часто дублируется, причем дело сводится буквально к одному-двум операторам. Для таких случаем вводить флаг нелепо, поэтому код просто дублируется. Так что, случаи, когда такая конструкция может быть удобной, есть (хотя я и не пишу усиленно на питоне).
Но если говорить о Nemerle, то было бы уместнее реализовать какой-то более общий случай.
Например, первое что пришло в голову:
statemachine TestStatemachine entry MainForeach
{
var Common: int;
situation MainForeach onexit NormalXXXHandling:
foreach(x in XXX)
{
if (Something) goto LoopFailture("Something wrong");
// ...
}
situation final NormalXXXHandling final:
Console.Print("XXX has beenhandled!");
situation final LoopFailture(Msg: string):
Console.Print("something wrong! {1}", Msg);
// А сюда можно добавить стандартные обработчики, например
situation SituationChanged(S1, S2):
Console.Print("State was switched {1} => {2}", S1, S2);
situation final ExceptionOccured(E):
Console.Print("Exception {1}", E.Msg);
}
// Сюда же интересно было бы добавить waitevent
Здравствуйте, VladD2, Вы писали:
VD>Я вижу ты тоже не знаешь как работает for/else в питоне. Питоновская версия for/else-а аналогична вот такому коду:
Да, я достоверно не знаю как работает for/else в Питоне.
Зато я знаю как for(in)otherwise будет работать в TIScript:
otherwise часть выполняется в том случае если тело цикла ни разу не исполнилось. И все.
Это я считаю концептуально более правильным и полезным. Никаких там break и прочая — все просто.
В питоне это сделано неправильно. Если у тебя есть break значит у тебя уже есть некий if внутри.
Вставить туда взведение флага — нет проблем.
VD>А то что демонстрируешь ты к питону не имеет никакого отношения. VD>Меня же интересует именно питоновское поведение (которое мне каежся не интуитивным).
Я же тебе и отвечаю. Только на своем примере который мне кажется более интуитивным.
Здравствуйте, Mystic, Вы писали:
F>>если не знать, то случится нечто непоправимое?. фича есть, кушать не просит.. M>Лишний член --- жопе непонятка. Ну и синтаксис у этой фичи какой-то неубедительный, не на 100% понятный интуитивно.
даже не знаю, чего тут неинтуитивного..
для x из X:
сделать что то
иначе:
сделать что то другое
I even wonder if else-clauses on for/while were a good idea. (The one
E>>on try is definitely a good idea since the use case is quite frequent
E>>and only clumsily handled otherwise; the use cases for else on
E>>for/while are less convincing IMO.)
M>Все равно название не очень хорошее. Лучше тогда M>
M> foreach a in B
M> ...
M> on break
M> ...
M>
"on break", судя по названию, не идентичен по поведению "else" в питоне..
Здравствуйте, VladD2, Вы писали:
F>>"on break", судя по названию, не идентичен по поведению "else" в питоне.. VD>Именно что идентичен, только с точностью до наоборот
VD>"else" в Питоне == "если не прервали". Именно о нелогичности этого я и говорил.
вариант "если прервали" тоже бы не особо то логичен был.. в таком варианте смысла даже нет.. как, впрочем, и во всём этом споре..
Здравствуйте, VladD2, Вы писали:
FR>>Вообще фича сделана антиинтуитивно, я вот всегда путаю что и когда вызывается
VD>В языке или в упоминаемом движке рендеренга?
В языке конечно, я этого движка не видел.
VD>Ясно. Спасибо. Именно это мне и было интересно. Просто "у нас" тоже хотят такое прекрутить, а мне как раз кажется, что такое поведение антиинтуитивно (с)
Тут такое дело мне например и многим другим это кажется пятой ногой, но есть люди которые с такой фичи почему-то сильно тащатся
В общем прикрутить можно, но ключевое слово else лучше заменить чем-то более внятным.
Здравствуйте, VladD2, Вы писали:
VD>Именно что идентичен, только с точностью до наоборот "else" в Питоне == "если не прервали". Именно о нелогичности этого я и говорил.
Здравствуйте, FR, Вы писали:
FR>Тут такое дело мне например и многим другим это кажется пятой ногой, но есть люди которые с такой фичи почему-то сильно тащатся
понимаешь, вот сидишь ты пишешь свой быдлокод, нужно тебе что-то.. и тут ВДРУГ!!1 это что-то оказывается уже реализованным в языке..
ты дописываешь кусок кода, откидываешься на спинку кресла, закуриваешь, и тебе хорошо-хорошо.. ^_^