Как стать автором
Обновить

Комментарии 11

Не понравилось. Язык неоправданно сложный получился. Например:
loop (my $i=0; $i < 4; $i++)
{
LEAVE {
say «Test leave»;
}
say «Another loop entry»;
}

Почему не просто

foreach (0..3)
{
say «Another loop entry»;
}
say «Test leave»;

Добавлена конструкция, которая не нужна. И остальные конструкции как-то не очень понятно зачем введены. Перл и так специфический язык, а тут ещё больше его будет тянуть в сторону от майнстрима (ну это, конечно, если мы представим что его кто-то будет использовать :)))))
Потому что TIMTOWTDI — конструкция с форичем тоже есть, и если она нравится больше — используешь её, нет — юзаешь луп. А вообще, так посмотришь на коммент, и либо это какой-то очень жалкий троллинг, либо приперся какой-то рьяный питонист/рубист/{подставь название своего любимого языка}, который только и умеет на этом самом языке говнокодить, и во всех остальных языках ищет те конструкции которые и выучил.
Комент и правда несколько похож на троллинг. Но ваш (с маленькой буквы) ответ — банальное хамство.
Хамство? Возможно, но по моему мнению такой коммент ничего другого не заслуживает. Троллить первым же комментом в посте?
Человек высказал свое мнение — выразил сомнение по поводу полезности конструкции языка (причем не foreach). Более того, ваша персона никак не была охарактеризована (нету даже упоминания оной).

Ну вот и объясните, зачем может понадобится LEAVE. Причем не прикриваясь принципом TIMTOWTDI — покажите примеры, когда вышеназванные фичи могут сделать код чище, компактнее или быстрее. Пока этого не сделано — ответ выглядит в стиле «ты не осилил», только в более грубой форме.
Я написал такой «хамский» комментарий не из-за того что он не смог осилить конструкцию LEAVE, а из-за того, в какой форме этот комментарий был написан. Выражать свои мысли можно по разному — можно как Вы, указывая на то что не нравится, но при этом не перегибая палки, а можно как я или как в первом комменте.

Конкретно насчет блока LEAVE — он должен выполняться при любом выходе из блока, даже в случае исключений. Пример — если действия, которые должны быть обязательно выполнены для освобождения какого-либо ресурса поставить просто в конец блока, и вдруг произойдет исключение до этих самых действий, то выполнений данного блока остановится, и ресурс так и останется занятым. Поэтому все действия по освобождению блока можно перенести в LEAVE. Понимаю что я не описал такого в статье, так как не смог скомпилировать пример, но и нельзя говоить о том, что что-то в языке бесполезно, если не знаешь как именно это что-то должно работать.
Лучше бы вы вообще не писали о LEAVE — обхамили и ладно, я бы промолчал. Ну раз написали… Не так он работает как вы написали. Вообще интересный стиль изложения — «вот есть такой прекрасный блок, он делает кажется то-то, но так ли это я не знаю, потому что запустить компилятор не смог, но я всё равно напишу свой представление о нём а кто не согласен тот дурак»! Первый раз встречаю такое в технической литературе… А то что в действительности делает конструкция — не важно, главное тиснуть статейку. Вот из таких и вырастают те самые говнокодеры.

Я не поленился почитать документацию и скомпилировать примеры — естественно правильные, всё отлично компилируется, и теперь я почти знаю что такое LEAVE и знаю что оно не делает то что вы описали. Почти — так как в документации по LEAVE явно опущены некоторые подробности, а тестирование на примерах, кроме знания как в конкретных случаях работает конструкция, малопродуктивно.

На всякий случай ссылки:
perlcabal.org/syn/S04.html#Phasers — путеводитель по тестам
raw.github.com/perl6/specs/master/S04-control.pod — описание
rakudo.org/how-to-get-rakudo/ — как скомпилировать rakudo (именно скомпилировать, так как в некоторых репозиториях лежит не очень свежий вариант)

Прошу прощения за грубость, но вы сами напросились.
Насчет LEAVE — я так же изучаю все по этому сайту — perlcabal.org. Признаю свою ошибку — неправильно понял фразу про раскручивание стека при исключениях. Но опять же, я не с потолка говорил, как он должен работать, а хоть и ошибочно, но читал про этот вопрос. Вобщем да, с LEAVE мой косяк.

Насчет же «вот есть такой прекрасный блок, он делает кажется то-то, но так ли это я не знаю, потому что запустить компилятор не смог, но я всё равно напишу свой представление о нём а кто не согласен тот дурак» и «А то что в действительности делает конструкция — не важно, главное тиснуть статейку» — все что я описываю в статьях проверяется лично мною на примерах, и если что-то не компилируется, то лишь упоминаю о существовании этого (в статье я не стал писать свое предположение о LEAVE, так как сам понимаю что это не проверено, и так делать нельзя).

Насчет грубости — грубость не так страшна если всё аргументировано.
Покинуть блок можно по-разному. В вашем контр-примере строка будет выведена только при обычном выходе из цикла. Если я сделаю return внутри, то ваш контрпример не сработает. То есть он не аналогичен блоку LEAVE.
Вообще, попытки ввести такие блоки это попытка контролировать поток выполнения, в каком бы направлении он ни пошёл. Смысл в этом есть.
Может быть и есть, но описание одного LEAVE должно быть на хорошую статью. Например, что происходит, когда я вызываю return внутри LEAVE?
Например, что выведет x1() и x2() и почему?

sub x1{
{
LEAVE {
say 'LEAVE x1';
return 'x1 LEAVE';
}
return 'x1';
}
}

sub x2{
LEAVE {
say 'LEAVE x2';
return 'x1 LEAVE';
}
return 'x2';
}

say x1();
say x2();

Извините, эта претензия не ко мне. Я просто хотел сказать, что блок не на пустом месте создан.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории