1. Perl / Говнокод #12011

    −148

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use Data::Dumper;
    
    sub get0 { print("get0\n"); return 0; }
    sub get2 { print("get2\n"); return 2; }
    
    my ($a, $b) = (1, 1);
    $a ? $b = get0() : $b = get2();
    
    print Dumper({
        'a' => $a,
        'b' => $b,
    });

    Результат несколько обескураживает :)
    http://ideone.com/V60Y1L

    Запостил: Elvenfighter, 27 Октября 2012

    Комментарии (57) RSS

    • Это часто работает непредсказуемо, всегда добавляй скобки:
      $a ? ($b = get0) : ($b = get2);
      Ответить
      • Причём Перлу не понравилось именно присвоение в той ветке, которая не выполнилась. Т. е. такой код работает:
        $a ? $b = get0 : ($b = get2);

        А если скобки поставить только у первого выражения, то будет жаловаться на несоответствие типов. Как он пытается распарсить выражение в этом случае?
        Ответить
        • Приоритер "=" низкий, поэтому выражение
          $a ? ($b = get0) : $b = get2;
          эквивалентно выражению
          ($a ? ($b = get0) : $b) = get2;

          в итоге присвоить get2 нечему.
          Ответить
          • Странно, что пока еще питонистов нет :) Они бы сразу сказали, что конструкция
            b = get0() if a else b = get2()

            синтаксически неправильная
            Ответить
            • Ебанутая конструкция
              some = then_expr if cond else else_expr
              до сих пор выносит мне мозг и отбивает всякое желание ею пользоваться. Это, наверное, единственное место в питоне, которое мне не нравится и режет глаза.
              Ответить
              • Написано более естественным языком.
                тото если тото иначе тото
                да и лишнее ключевое слово then убрали
                Ответить
                • > Написано более естественным языком.
                  Для меня, как и для многих других программистов, для которых питон не является основным языком, более естественным порядком все-таки является cond -> then_expr -> else_expr. Это, конечно, мое имхо, но и на голосовании PEP308 многим людям тоже не нравился данный порядок, и этот вариант стоял аж на четвертом месте.

                  Судя по всему, из-за того, что голосование не выявило явного победителя, а оставлять питон без тернарника и терпеть говнище в виде cond and T or F уже надоело, Гвидо проявил инициативу, и зафорсил свое предложение с T if cond else F.
                  Ответить
                  • >Для меня, как и для многих других программистов, для которых питон не является основным языком


                    Для тебя, как и многих других программистов, для которых питон не является основным языком для общения - это весьма приятный и лаконичный вариант, пришедший из естественных языков передачи информации между людьми
                    Ответить
                    • Это, безусловно, было бы удобно, будь питон естественным языком.

                      Но, к сожалению, питон это язык программирования, а когда я пролистываю код, мне, почти всегда, хочется увидеть условие, и только затем последствия, к которым приведет его исполнение. Почему? Во-первых потому, что так легче понять логику кода. Во-вторых - действия, как правило, длиннее условий.

                      Приведу пример из пёрла:
                      die("Can't connect to the remote server $serverName. Connection rejected.") if ($rejected);
                      
                      if ($rejected) {
                          die("Can't connect to the remote server $serverName. Connection rejected.");
                      }
                      Не правда ли, что второе читается легче и быстрее, хотя и несколько отдалено от естественных языков?
                      Ответить
                      • Применять тернарник для действий - то еще говно.
                        Да и сколь-нибудь длинные вычисления тоже лучше класть в классический if. Конструкция x if c else y - только для коротких операций и должна умещаться в одну строку.
                        Ответить
                        • > Применять тернарник для действий - то еще говно.
                          Истину глаголите.

                          Ну так то да, тернарник с большими формулами в ветвях и на си смотрится как говно.
                          Ответить
                      • Я больше скажу, в первом условие вылазит за край экрана, поэтому сами понимаете.
                        Ответить
                    • P.S. Раз уж речь зашла о языке общения:
                      1) Я сварю пельмени, если они есть, иначе придется сходить в магазин.
                      2) Если у меня есть пельмени, я сварю их, иначе придется сходить в магазин.

                      У меня ПГМ, если мне больше нравится второе предложение? ;)
                      Ответить
                      • (2) - длинее и содержит лишние знаки препинания
                        Ответить
                      • 3) Я сварю пельмени, иначе придётся сходить в магазин, если у меня пельменей нет.
                        Ответить
                      • Если есть - купи десяток. (q) из старого бойана
                        Ответить
                      • Ты забыл слово то, отделяющее условие от действия.
                        Если у меня есть пельмени, то
                          я сварю их, 
                        иначе 
                          придется сходить в магазин.
                        Ответить
                        • Даже подсветилось ;)
                          Ответить
                          • Жаль, что то не подсветилось
                            Ответить
                            • Если у меня есть пельмени, тогда
                                я сварю их, 
                              иначе 
                                придется сходить в магазин.
                              Ответить
                              • Эххх, не знаю я одинэс
                                Ответить
                                • Я тоже не знаю 1с, конец забыл дописать.
                                  Ответить
                                  • КонецЕсли
                                    же.
                                    Там для всего свой конец, даже для неба, даже для.
                                    Ответить
                                    • Если есть КонецЕсли, то есть и КонецИначе? ;)
                                      Ответить
                                      • А есть ли в 1с КонецКонца?
                                        Ответить
                                      • Да, это и странно. Например, цикл объявляется как Для По Цикл или Пока Цикл, с окончанием КонецЦикла (но не КонецПока и не КонецДля, как было бы логично). А вот для условия Если Тогда нет окончания КонецТогда.
                                        Я считаю, что с этим разнообразием концов они пошли гораздо дальше паскаля. Из аналогий - разве что бейсик с его NEXT/END IF.
                                        Ответить
                                • А в Аде ты тоже End If; не пишешь?
                                  Ответить
                              • Тут видимо, разница в оттенках смысла:
                                Если голоден Тогда
                                  свари пельмени
                                Иначе
                                  попей чаю
                                Конец

                                свари пельмени Если они есть Иначе хотя бы чаю попей...
                                Ответить
                                • Если Не Я.лиГолоден() Тогда
                                      Я.пью(Новый Чай())
                                      французскаяБулка = Новый Булка()
                                      мягкаяБулка = Новый Булка()
                                      Я.ем(французскаяБулка) И (мягкаяБулка)
                                      Уйди
                                  КонецЕсли
                                  Если Не пельмени Тогда
                                      пельмени = Магазин.Купить(Пельмени)
                                  КонецЕсли
                                  Я.ем(пельмени)
                                  Ответить
                                  • > французскаяБулка = Новый Булка()
                                    Только сегодня! Спешите видеть! Великий и ужасный маг Lure Of Chaos на ваших глазах создаст чай и булки и съест их!
                                    Ответить
                                  • > Новый Чай()
                                    А вот будь это язык без GC, чай бы утёк.
                                    Ответить
                                    • > А вот будь это язык без GC, чай бы утёк.
                                      Тогда пришлось бы и посуду за собой удалять или мыть и возвращать в пул.
                                      Ответить
                              • >Жаль, что то не подсветилось
                                Если у меня есть пельмени, То
                                  я сварю их, 
                                Иначе
                                  придется сходить в магазин.

                                Учитесь, все подсвечивается.
                                Ответить
                        • Если, пельменей нет, то купить в магазине пельмени.
                          Если, пельмени есть, то приготовить пельмени
                          иначе разгрузочный день.
                          Ответить
                          • Это как в том бояне:
                            Посылает жена в магазин, дает наставления:
                            - Купи буханку хлеба, а если будут яйца, то десяток.
                            Программер возвращается, приносит 10 буханок хлеба.
                            - wtf???!!!
                            - но ведь яйца–то были!!!
                            Ответить
                    • По поводу естесственных языков:
                      - а кто вообще сказал, что там это хорошо устроено? Как правило, там херня полнейшая.
                      - из практических соображений, даже в натуральных (и не синтетических) языках используют конструкции, где сначала идет условие, а потом действие. Например, телефонный автоответчик большой компании, цитирую:
                      "Для получения информации на русском языке нажмите один, ... служба технической поддержки? - нажмите 9 и решетку" и т.д. Потому что бесполезно тратить время позвонившего рассказывая ему как сделать то, что, возможно ему делать вообще не нужно, и только рассказав сообщить о том, зачем это делать.
                      Ответить
                      • > и только рассказав сообщить о том, зачем это делать
                        А в этот момент человек уже и забыл как это делать, потому что слушал предыдущий фрагмент невнимательно, и не старался его запоминать...

                        Все верно, в подобных случаях условия должны идти в начале, чтобы человек знал, когда ему сосредоточиться.
                        Ответить
                      • Хак: давишь 0 и трубку берет специально обученная девушка
                        К сожалению к настоящему времени почти везде заткнуто
                        Ответить
                      • Я вообще скажу, что интерфейс "выбери наиболее подходящий вариант" - дерьмо по определению. Некоторые возмущаются, что вот блин, ллюди тупые, терминалы читать не умеют. Да нихуя. Терминалы говно.
                        Вот надо мне узнать, сколько у меня бабла на карточке. Подхожу, ищу вариант где есть что-то типа "узнать счёт". Нету. Ищу вариант со словом "баланс". Нету. Оказывется, нужен был вариант "выписка по счёту". Ну пиздец.
                        Если бы там стоят специальный официант, то я бы, не просыпаясь и не забивая мозг на 100% задачей "какой бля вариант выбрать?!", подошёл бы, спросил "скока денег у меня" и всё.
                        Терминалы с вариантами выбора - говно. Особенно если варианты каждый раз меняются
                        Ответить
                        • В конце прошлого века была такая фишка, называлась "экспертные системы", ну, сегодня только в фильмах типа научной фантастики тех лет осталось. В первом "Чужом" такой компьютер был, HAL из "Космической Одиссеи" и т.п. Вот там как раз идея и была в том, чтобы программа умела NLP, и понять, и осознанный результат выдать, а потом поняли, что наука еще не в состоянии, и забили...
                          Ответить
                          • Это не конец прошлого века, это 60е-70е
                            Ответить
                            • Ну это началось тогда, а в упадок пришло в конце 80-х, так что, ну, ок, в середине-конце прошлого века.
                              Ответить
                              • Называй по 10летиям, потому что культура в 20м веке так быстро менялась, что говорить о "второй половине" - это пиздец как широко.
                                Ответить
                            • Лол кто минуснул?
                              Может он не в курсе, когда эти фильмы вышли? Или он считает, что 60е-70е - это конец века?
                              Ответить
                      • Спорный вопрос, что считать условием, а что — действием.

                        Вариант 1: ЕСЛИ хотите получить информацию, нажмите один.

                        Вариант 2: Вы получите информацию, ЕСЛИ нажмёте один.
                        Ответить
                        • Каким образом спорный? Ваши варианты отличаются только синтаксически, в обоих случаях условие на первом месте, но второй вариант хуже, т.как слушаетель узнает от ом, что он слышит условие только посередине предложения (и ему прийдется мысленно сформировать предложение по-новой для того, чтобы перевести его в более удобоваримую форму). Рассчет на то, что слушатель забудет, или не сможет правильно трансформировать предложение с условием из утверждения - одна из фишек, которые часто используют в рекламе, когда, например, вам рассказывают сначала про кучу скидок, а потом уточняют условия получения этих скидок.
                          Ответить
                  • Да, это одна из немногих вещей, которые мне не нравятся в python.
                    Ответить
          • А вот в крестоблядских языках
            ($a ? ($b = get0) : $b) = get2;
            вполне может быть скомпилировано
            Ответить
            • Питушок не осилил кресты? Поздравляю.
              Ответить
    • $b = $a ? get0() : get2();

      Говнокодеры, млин.
      Ответить
    • Это документированная особенность тернарного оператора в Perl: если оба возвращаемых значения являются lvalue, то результату оператора можно выполнять присваивание. С учётом приоритета операторов получаем, что выражение:
      $a ? $b = get0() : $b = get2();

      эквивалентно
      $c = get2();
      $b = get0() if $a;
      $b = $c;
      Ответить

    Добавить комментарий