do while используется в ситуациях, когда нужно, чтобы тело цикла отработало хотя бы один раз. Например, нужно сделать что-то, а если не получилось - повторить. И я, как человек регулярно использующий эту конструкцию, в очередной раз выражаю недоумение по поводу т.н. IT-юмора - у меня складывается впечатление, что пытаются шутить люди, знакомые с программированием только по школьным урокам.
я твой антагонист
Чур я тогда его девушка.
Теперь деритесь до смерти.
Циклы вообще для лохов. Хвостовая рекурсия рулит. =Ъ
Расскажи это системным программистам у которых маленький стек
Не важно, что у тебя стек маленький. Главное как ты им пользуешься. Для выполнения своей функции достаточно и маленького. И плевать, что все хотят его большой.
хвостовая рекурсия конвертится в цикл, зачем ей стэк?
Не только лишь все компиляторы/интерпретаторы умеют в оптимизацию хвостовой рекурсии.
Хвостовая рекурсия — это когда у твоего хвоста тоже есть хвост, у которого, в свою очередь, тоже есть хвост с хвостатым хвостом?
ты хочешь сказать, что есть что-то лучше goto?
по сути, для программирования хватит if'ов и goto , остальное придумали сами программисты чтобы себе жизнь облегчить)
Расскажи это питонистам
Сеньер-питонист на связи. do-while иногда сильно не хватает и приходится изгаляться со всяким говном в виде флагов.
Привет while True: if break
Вместо одной строчки - три.
А теперь об оплате: нам плятят за шашечки, ехать или количество строк?
Это тут никаким боком. Я предпочитаю короткие конструкции и синтаксический сахар, мне не нравится, когда язык ограничивается на основе того, что жуниоры могут неправильно использовать какие-то конструкции.
Бомж-питонист также выходит на связь. Я понимаю твою боль.
Верёвку Аллена Голуба почитай для начала, иначе складывается впечатление, что здесь только ты по школьным урокам знаком с профессией.
Ну, конкретное мнение зависит от источника, хотя, в принципе, почти все, хоть и не гонят пинками так же как goto, все же пренебрегают do while. "Можно, но лучше не надо" - общий вердикт.
Боязнь пользоваться do-while - она примерно там же, где и боязнь goto. В языках без сборки мусора без goto писать неприятно, потому что не ясно, как централизованно освобождать ресурсы по выходу из функции. Или прерывать циклы энного уровня вложенности - можно флагами, но goto удобнее. Его не добавляют в некоторые языки исключительно из-за того, что дурачки потом пишут на них логику. Мне кажется, это в корне неверный подход.
Скажем так - есть крайне ограниченный набор ситуаций в которых goto оправданно, в основном это встречается в случаях, когда надо написать код, быстро и эффективно обрабатывающий ошибки (типа ОС). В стандартном пользовательском приложении использование goto обычно тяжело оправдать. do-while может быть полезен, но нужно четко понимать: зачем он нужен. В противном случае легко багов навводить.
do-while так же создаёт баги, как и обычный while или if. В некоторых случаях даже безопаснее, т.к. в теле могут инициализироваться переменные, участвующие в условиипродолжения.
Да практически в любой сложной программе на си нужен goto, когда, например, аллоцируют пачку буфферов, открывают устройства, а потом в одном месте их закрывают - при обработке ошибок в рандомном месте или при успехе.
По моему опыту, большинство случаев, когда хочется воткнуть goto можно решить извлечением метода и заменой на return. Не всегда, конечно же.
Дилемма. Либо делать язык, который разрешает многое, но тогда найдутся дурачки, которые будут использовать его неправильно. Либо делать хороший язык, где нельзя говнокодить, только программы на нём плохо пишутся. Два стула в области программирования.
Практика показывает, что говнокодить можно на любом языке :D
И это правильный ответ!
ИМХО, goto чаще всего применяется как раз в языках без сборки мусора, а в особенности, в Си. Это очень распространенный случай, когда ты выделяешь какие-то буферы, открываешь файлы или иные ресурсы, в конце должен все закрыть. Но у тебя куча проверок на успешность операций, в случае фейла goto на очистку. В С++ этого можно избежать, обернув ресурсы в классы и воспользовавшись RAII.
Тут, конечно, ебаные эксепшены, но можно и без них при большом желании, например, написать свой враппер над старым добрым маллоком.
Тут, конечно, ебаные эксепшены, но можно и без них при большом желании, например, написать свой враппер над старым добрым маллоком.
Я ровно то же самое писал тащемта)
Программирование - это целый мир, и есть в нём разные закоулки. Есть тут и мощные системы на джаве, построенные по всем канонам оо-проектирования, есть и перфомансный низкоуровневый код, где допускается больше говнокода в угоду быстродействию.
Лично я чаще использую for/foreach/map/filter, чем do-while, и полностью согласен с картинкой.
Лично я чаще использую for/foreach/map/filter, чем do-while, и полностью согласен с картинкой.
И тут ты получаешь легаси на java 6...
Не вижу goto...
его не впустили
Он еще хуже чем do while
INNER:
continue INNER;
нахер goto
continue INNER;
нахер goto
бля, Иисус - ты должен освобождать людей от греха
Начни кодить на асэмблере - увидишь!
В Swift можно сделать такую забавную конструкцию
for case let object as SomethingProtocol in objects { }
или
for object in objects where object is SomethingProtocol { }
Очень удобно когда надо пройтись по фильтрованному массиву без сдвига индексов или предварительной фильтрации
for case let object as SomethingProtocol in objects { }
или
for object in objects where object is SomethingProtocol { }
Очень удобно когда надо пройтись по фильтрованному массиву без сдвига индексов или предварительной фильтрации
Как мне кажется, фильтрация в циклах - какая-то муть. А её ещё в C++ 17 или 20 вводят.
Суть в том, что так с отфильтрованной коллекцией ничего нельзя сделать, кроме как пройтись по ней здесь и сейчас. Сохранить в переменную? Нет. Передать в функцию? Тоже нет. Второй раз пройти? Нет, надо снова писать такой же цикл!
Гораздо удобнее подход с filter в функциональном программировании или с generator expression in python. В этих случаях отфильтрованная коллекцию можно переиспользовать и/или сохранять в переменную/передавать как аргумент.
Суть в том, что так с отфильтрованной коллекцией ничего нельзя сделать, кроме как пройтись по ней здесь и сейчас. Сохранить в переменную? Нет. Передать в функцию? Тоже нет. Второй раз пройти? Нет, надо снова писать такой же цикл!
Гораздо удобнее подход с filter в функциональном программировании или с generator expression in python. В этих случаях отфильтрованная коллекцию можно переиспользовать и/или сохранять в переменную/передавать как аргумент.
Ну в Swift можно вызвать метод filter для коллекции и в функциональном стиле отфильтровать а потом записать в переменную. Тут другой кейс использования. Допустим у тебя есть коллекция всех UIView и тебе нужно стереть текст из всех UIViewLabel (подкласс UIView) в стандартном подходе ты делаешь каст к нужному типу внутри цикла по всем элементам. Ну или сначала фильтруешь коллекцию по типу элементов а потом снова пробегаешься по всей коллекции. Это не круто. Решение пробегать только по необходимым элементам не удаляя остальные гораздо более гибкое и красивое.
В любом случае Swift это опенсорс проект (на данный момент последняя версия Swift 5) и у любой фичи языка есть четкое обоснование и одобрение сообщества. Не правильно говорить что это какая-то муть.
В любом случае Swift это опенсорс проект (на данный момент последняя версия Swift 5) и у любой фичи языка есть четкое обоснование и одобрение сообщества. Не правильно говорить что это какая-то муть.
А, тут ещё и динамика замешана. Интересно. Впрочем, не так важно, по чему фильтровать.
Такая конструкция красивее простого цикла, хотя менее гибкая, чем filter+map и их аналоги на итераторах.
Результат filter можно засунуть в любое место, куда можно было засунуть массив, даже в тот же цикл с фильтрацией. Код становится более однородным, для разных обходов и преобразований коллекции используются одни и те же инструменты.
Понадобилось наложить фильтр на фильтр - filter удобнее цикла. Понадобилось отложить выполнение: сначала вычленить нужные элементы, а потом где-то стереть из них текст - filter удобнее цикла. Понадобилось применить стандартный алгоритм (например, в C++, что-нибудь из алгоритмов из STL) - filter удобнее цикла, для цикла надо реализовывать алгоритм ещё раз.
Хитрый цикл усложняет язык, а filter пишется в рамках существующего языка, в зависимости от задачи можно реализовать версию с копированием в новый список или, версию с итератором, чтобы O(1) по памяти. Если написать правильный bidirectional итератор, можно с помощью std::sort отсортировать отфильтрованные элементы прямо на их местах в коллекции. Написать несколько строк кода на обычном языке для конкретного проекта - гораздо проще и спокойнее, чем ждать месяцы заседаний комитетов, утверждений фичи, добавление в компиляторы, поддержка фичи долгие годы (из-за чего обновлённый язык выглядит уродливо), невозможность простого удаления фичи, если ей воспользовались в куче старого кода.
Чёткое обоснование можно к любой фиче написать. Формально восьми операций языка brainfuck хватает для написания любых вычислительных программ, всё остальное - мнения и оценки стоимости конкретных проектов с конкретными исполнителями :)
Сообществу не стоит доверять. Сообщества обычно плодят усреднённые компромиссные решения, рассчитанные на потребителя с усреднёнными показателями (которого не существует). А главное - полёт фантазии сообщества ограничен привычками, уже реализованными фичами и представлениями по здравом смысле.
Такая конструкция красивее простого цикла, хотя менее гибкая, чем filter+map и их аналоги на итераторах.
Результат filter можно засунуть в любое место, куда можно было засунуть массив, даже в тот же цикл с фильтрацией. Код становится более однородным, для разных обходов и преобразований коллекции используются одни и те же инструменты.
Понадобилось наложить фильтр на фильтр - filter удобнее цикла. Понадобилось отложить выполнение: сначала вычленить нужные элементы, а потом где-то стереть из них текст - filter удобнее цикла. Понадобилось применить стандартный алгоритм (например, в C++, что-нибудь из алгоритмов из STL) - filter удобнее цикла, для цикла надо реализовывать алгоритм ещё раз.
Хитрый цикл усложняет язык, а filter пишется в рамках существующего языка, в зависимости от задачи можно реализовать версию с копированием в новый список или, версию с итератором, чтобы O(1) по памяти. Если написать правильный bidirectional итератор, можно с помощью std::sort отсортировать отфильтрованные элементы прямо на их местах в коллекции. Написать несколько строк кода на обычном языке для конкретного проекта - гораздо проще и спокойнее, чем ждать месяцы заседаний комитетов, утверждений фичи, добавление в компиляторы, поддержка фичи долгие годы (из-за чего обновлённый язык выглядит уродливо), невозможность простого удаления фичи, если ей воспользовались в куче старого кода.
Чёткое обоснование можно к любой фиче написать. Формально восьми операций языка brainfuck хватает для написания любых вычислительных программ, всё остальное - мнения и оценки стоимости конкретных проектов с конкретными исполнителями :)
Сообществу не стоит доверять. Сообщества обычно плодят усреднённые компромиссные решения, рассчитанные на потребителя с усреднёнными показателями (которого не существует). А главное - полёт фантазии сообщества ограничен привычками, уже реализованными фичами и представлениями по здравом смысле.
А в чем отличие от анонимных функций в интепретаторах, типа for (sort {...} grep {...} @array ) или аналогичного оопешного варианта:
foreach (arr.grep(...).sort(...)) ?
foreach (arr.grep(...).sort(...)) ?
Так твой третий подход и есть функциональный. У тебя есть функция для фильтрации массивов, принимающая на вход анонимную функцию фильтрации элемента и сам массив.
Ты наверно перепутал, 2 - функциональный.
В третем это проход по массиву через for это конечно можно рассматривать как вызов функции для элементов массива, но этот вызов происходит для исходных элементов. Нет процесса фильтрации (создания отфильтрованного массива). Это довольно легко проверить на массиве большого размера.
В третем это проход по массиву через for это конечно можно рассматривать как вызов функции для элементов массива, но этот вызов происходит для исходных элементов. Нет процесса фильтрации (создания отфильтрованного массива). Это довольно легко проверить на массиве большого размера.
Это нюансы производительности. Создается ли фильтрованная копия массива или массив оборачивается в геттер, выбирающий нужные элементы - особой роли в общем случае не играет.
Это Kotlin?
Это Swift 5, приложения под iOS / macOS на нем пишутся. Вообще он опенсорс но его порт под винду / linux не годится ни на что сложнее Hello World!
If
GOTO
GOTO
Чтобы написать коммент, необходимо залогиниться