1. PHP / Говнокод #17809

    +167

    1. 1
    2. 2
    3. 3
    4. 4
    $a = true;
    $b = $a xor true;
    
    var_dump($b);

    ПЫХОПРОБЛЕМЫ

    http://ideone.com/cRMQor

    bool(true)

    Запостил: someone, 17 Марта 2015

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

    • Разгадка:

      Оператор xor имеет более низкий приоритет, чем присваивание. Сначала выполняется $b = $a, затем результат (true) ксорится с true и результат нигде не используется.
      Ответить
      • Больше скобок хороших и разных.
        Вот почему я всегда говорю о разумной минимализации числа значков и операторов в языке (любом), считая их синтаксическим сахаром?

        Сделали бы функцию, никто бы не умер:
        $b = xor ($a,true);
        Ответить
        • Я бы умер. Зачем этот лиспенный функциорай?
          Инфиксная нотация наглядна, её ещё в школе изучают.
          Возможно, надо было ограничить количество приоритетов.
          // Последовательность, линейная структура:
          A or B or C or D or E
          // Чёртово дерево с перевесом на левую ветку и вложенностью (стэк, прости):
          or(A, or(B, or(C, or(D, E))))
          Ответить
          • >// Чёртово дерево с перевесом на левую ветку и вложенностью (стэк, прости):
            >or(A, or(B, or(C, or(D, E))))
            Неосилятор вараргов детектед.
            or (A, B, C, D, E) //код короче. DRY рафинированный
            Ответить
            • > Неосилятор вараргов детектед
              or (A, B, C, D, E) //код короче. DRY рафинированный
              Чьи-то розовые фантазии, в реальности это будет выглядеть как-то так:
              and (or (long_expression, very_long_expression), or (another_long_expression, true))
              Ответить
              • А вы альтернативную версию напишите, и поймете что без скобок там не разобраться.

                > long_expression or very_long_expression and another_long_expression or true
                Выглядит как дерьмо, я из принципа расставлю в таком коде скобки, мне проще сделать так чем помнить приоритеты в каждом отдельно взятом говноязыке.
                Ответить
                • > А вы альтернативную версию напишите, и поймете что без скобок там не разобраться.
                  И то верно.
                  Ответить
            • Волшебная запятая. Искусственно ввели последовательность и радуются.
              A or B and C or (D or E) and F // Xom94ok уже показал подобное
              a*x*x + b*x + c // даже переводить не хочется

              А если заменить f(питух) на f.питух или вовсе оставлять пробел как в хаскеле, наступит всеобщее счастье. Будут AST, построенные только на инфиксной питушне. Симметрия и гармония.
              print . 2 + 2 vs скобкоад print(sum(2,2))

              Кстати, надо именно f.x, но ни в коем случае не пайпоподобное (или ООП-стиль) x.f, иначе будут проблемы. Скажем, придётся списки тоже задом наперёд писать. И аргументы функций при их определении.
              Ответить
              • >a*x*x + b*x + c // даже переводить не хочется
                >>>Вот почему я всегда говорю о разумной минимализации числа значков и операторов

                >или вовсе оставлять пробел как в хаскеле, наступит всеобщее счастье
                Вы так гойворите будто в хацкеле ничего не пишут и не читают задом наперёд.
                Ответить
                • > задом наперёд
                  Зато гармонично.

                  Иначе будет либо туда-сюда ездящее x.map(f(y,z))
                  Либо питушня. Вот, скажем, хотим мы запилить функцию curry, у нас есть точка как оператор применения функции и стрелка для лямбд.
                  -- прямой порядок: f.x
                  \x y -> f.x.y -- лямбда
                  ($) f x = \y -> f.x.y -- частичное применение
                  curry f = (($) $) -- гармония
                  (curry.f).x.y -- гармония
                  
                  -- обратный порядок: x.f
                  \x y -> y.x.f -- лямбда
                  ($) x f = \y -> y.x.f -- частичное применение
                  flip f = \x y -> x.y.f
                  curry  f = ($ (($).flip) -- говно, нужен flip
                  y.x.(f.curry) -- говно

                  Во втором примере придётся либо страдать, либо задавать лямбды как \y x -> y.x.f и писать уже в аргументах задом наперёд. Либо для n-арных функций писать первым n-ый аргумент, превратив работу с каррированными функциями в странное месиво: (x,y).f и y.x.f в одной программе!
                  Ответить
                  • Нет.
                    Я говорю как оставаясь в рамках пхп легко и просто решить проблему, не плодя лишних сущностей, и тут же в тред немедленно врывается функциональная мразота, которая начинает утверждать - ВСЁ ЭТО ГОВНО, НАДО БЫЛО СДЕЛАТЬ ВМЕСТО ПХП ХАЦКЕЛЬ. Хуиррирование, частиное гавнирование, залупирование, конченый синтаксис.

                    Ну вот нормально, да?

                    Блять, ну извините меня, если бы вместо ПХП сделали хаскель, то сейчас бы пхпшники сидели бы без работы где-то рядом с хацкелистами, а люди бы придумали другой промышленный язык, который мы бы сейчас обсуждали на сайте, написанном на этом языке. Неужели это не очевидно. ХАЦКЕЛЬ НЕ НУЖЕН.
                    Ответить
                    • Да тут не каррирование и петуширование, а проблема гармоничности!

                      ассемблер (гармония):
                      op1
                      op2
                      op3
                      op4
                      op5

                      ЯВУ (говно):
                      op1.op5(op4(op2, op3));
                      op1; op4(op2, op3); op5;
                      op1; op4(op3, op2); op5; - не важно, когда вычислять аргументы

                      Хаскель (гармония):
                      op5 . op4 op2 op3 $ op1
                      op5 . op4 op3 op2 $ op1 - не важно, когда вычислять аргументы
                      Ответить
                      • ЯВУ (говно):
                        op1.op5(op4(op2, op3));
                        op1; op4(op2, op3); op5;
                        op1; op4(op3, op2); op5; - не важно, когда вычислять аргументы

                        Это просто потому что люди ленвые и экономят строчки.

                        op0=op4(op2, op3)
                        op1.op5(op0)
                        op1()
                        op4(op2, op3)
                        op5()
                        op1()
                        op4(op3, op2)
                        op5()

                        Гармония уровня ассемблера.
                        И да, точки с запятой - дерьмо для любителей лепить в одну строку.
                        Ответить
                        • > экономят строчки
                          op1
                          op4(op2, op3)
                          op5
                          Всё равно говно, op2 и op3 стоят после op4.

                          Тут надо записывать всё наоборот и вызывать функции так: (op2, op3)op4. Если не пилить петуширование, можно даже op2 сделать первым аргументом, а не как в том моём сообщении.
                          Тгда да, в императивном коде для гармоничности достаточно f(x,y) заменить на (x,y)f.
                          Ответить
                          • http://www.gamedev.ru/flame/forum/?id=159040
                            Ответить
                            • Тарас изобрёл continuation passing style?
                              Ответить
                              • Угу :) Тут прошло незамеченным: http://govnokod.ru/11957
                                Ответить
                              • А хоть одна среда, оптимизированная на CPS?
                                Или это сношение мозга ради сношения мозга?
                                Ответить
                                • ghc преобразует код к cps-виду, рантайм в основном через продолжнения работает.
                                  Ответить
                                  • ну он его сам преобразовывает. Я имею в виду мне как обычному быдлокодеру это где нибудь может пригодится?
                                    Ответить
                                    • > мне как обычному быдлокодеру это где нибудь может пригодится?

                                      node.js и похожие асинхронные либы (libuv) по сути предоставляют cps-интерфейс.
                                      Ответить
                                    • Но в основном, конечно, cps нужен для того, чтобы понять, что он говно, и переключиться на акторы/корутины.
                                      Ответить
                                      • Акторы - из агентно-ориентированного программирования?

                                        А про корутины я второй раз слышу, слово красивое
                                        Ответить
                                        • Сопрограммы. О них еще Кнут писал. Эххх, щегол ты еще.
                                          www.youtube.com/watch?v=dJ-NA86bYQ4
                                          Ответить
                                          • Наверное у него и слышал. Я в курсе, что сопрограммы
                                            Ответить
                                            • От него и слышал?
                                              есть такая штука yield, вместо return. оно тогда запоминает точку выхода и при следующем вызове уже из неё идёт дальше.
                                              чсх в отличии от остального сахара, который форсят, эту фичу так просто не реализуешь, ибо это функция/процедура/метод+стейт в виде точки выхода.
                                              Ответить
                                              • да, он меня грудью вскормил. вскармливал и приговаривал - "корутины, корутины"

                                                Логично, что я об них почти ниче не знаю - я их никогда не юзал.
                                                Ответить
                                • > А хоть одна среда, оптимизированная на CPS?
                                  node.js
                                  Ответить
                          • > f(x,y) заменить на (x,y)f.
                            А потом пойти дальше, и вообще избавиться от скобочек. Получив forth с его джвумя стеками.
                            Ответить
                            • О чём и речь, людям не нравится скобоки аля лисп и соответственно префиксная нотация.
                              Ну так берите форт с постфиксной нотацией вообще без скобок.
                              Ответить
                              • Наглядно. Однозначно. Без скобочек. Всё это - пыхофорт.
                                true $ a !
                                $ a @ true xor $ b !
                                $ b @ var_dump
                                Ответить
                                • Доллар тогда уже тоже нужно после имени переменной писать, тогда доллар бы стал объявлением переменной (но мог бы использоваться либо только для объявления без начального значения, либо только с начальным):
                                  :$
                                      (value name -- )
                                      >r >r
                                  ;
                                  ture a $ \ put "true" into cell named "a"
                                  Ответить
                                  • $ в моём коде работает примерно как " - читает имя до пробела и помещает его на стек. Поэтому до. Иначе придётся переменные как-то декларировать перед их испоьзованием...
                                    Ответить
                          • > ассемблер
                            > гармония
                            Ты блат почитать его попробуй с сохранением общей семантики порограммы, умник, блат
                            Ответить
                    • Haters gonna hate.
                      Ответить
              • Не понял, а как отличить
                f g x y

                от
                f g x y
                ?
                Ответить
                • Так же, как и 2+2*2 от 2+2*2 - либо всё же добавить скобки, либо дать имя подвыражению.
                  Ответить
                  • >либо всё же добавить скобки, либо дать имя подвыражению
                    И какую в итоге проблему решает?
                    Если надо вводить либо временную переменную, либо пилить скобки?
                    Ответить
                    • Проблему избытка скобок.

                      Впрочем да, неидеальное говно выходит с иногда-скобками, хоть и чаще читается легче, чем симметричные варианты "скобки везде" и "скобок нет" (с операторами "=" и ",").
                      Ответить
                      • Как уже говорилось "скобок нет" - это форт, а "скобки везде" - лисп.
                        пхп и хаскель это "иногда-скобки"
                        Ответить
                        • >>хаскель это "иногда-скобки"

                          но, в основном, . $ и прочая непонятная пижня
                          Ответить
                • Это же чтобы удобнее было.
                  Ответить
            • Тогда не or a any
              Ответить
        • Используй J, там нет приоритетов операторов.
          Ответить
          • Там вообще операторы-то есть?
            Ответить
            • В терминологии там verbs и adverbs. Но очень похоже на операторы. + - % *
              Ответить
      • Это наследие Perl'а увы.
        Ответить
      • А вот нехуй юзать незнакомые операторы и функции не читая доку! У меня коллега точно так же поюзал and вместо &&, и долго удивлялся.
        Ответить
        • Помницо история про || в мускуле :)
          Ответить
          • > про || в мускуле
            Ну там они вообще пидорасы. Зачем-то добавили сишкоблядские операторы, хотя SQL ну совсем никакого отношения к си не имеет...
            Ответить
            • тоже не понимаю, нах бинарная логика в запросах
              Ответить
          • эм, разве это не конкатенация по стандарту?
            Ответить
      • Ебать, чтобы какой-то оператор имел более низкий приоритет, чем присваивание... (facepalm)
        Ответить
        • Ну это пёрловский управляющий оператор, чтобы писать в духе
          hui() or $pizda = "djigurda"
          Вот только xor в таком контексте бесполезен - в отличие от or и and он один хуй всегда будет вычислять оба выражения. Не пойму, зачем они его вообще сделали.
          Ответить
      • Блядь, так это же перл с его print (1+2)+3; !
        Ответить
    • Но при все при этом http://ideone.com/l1CCqF
      Ответить
    • Зато можно делать
      $file = fopen('foo.txt', 'r') or die;
      Ответить
      • Этот код работал бы с любыми приоритетами операторов. Просто в другом случае это логически исполнялось бы как $file=fopen(...) or $file=die();
        Ответить
      • мне больше нравится формулировка and die()
        Ответить
    • > конкатенация
      Хе-хе. Я тоже так думал: http://govnokod.ru/13032

      > по стандарту
      - Папа, а стандарт SQL существует?
      - Нет сынок, это фантастика.
      Ответить
    • кстати, в каком контексте понадобился оператор xor? лично мне он лет 10 или 15 уже не попадался
      Ответить
    • Нахуя вообще эти приоритеты? Сделали бы слева направо выполнение, и проще, и таких проблем не будет. [/соlor]
      Ответить
    • показать все, что скрытоXOR - это побитовая операция суммы.
      1 XOR 1 = 10 и уж никак не 0

      Ну а 10 это ниразу не False в битовом представлении, даже в С++

      Следовательно, все ваши пробшлемы - это проблемы с пониманием работы PHP
      Ответить
      • >> 1 XOR 1 = 10

        Давай сделаем вид, что ничего не было и ты пойдешь делать уроки и никогда больше сюда не вернешься, а я взамен не скажу твоей мамке, что ты сидишь на сайтах для взрослых дядь
        Ответить
      • а что за непобитовые операции суммы такие?
        Ответить
      • >> 1 XOR 1 = 10
        Ясно.
        Ответить
      • >суммы

        по модулю 2.
        Ответить
      • Вспомнился реальный случай из собеседования. Так юное даорование нарисовало таблицу истинности исключающего или:
        +---+---+---+
        | a | b |a^b|
        +---+---+---+
        | 0 | 0 | 0 |
        +---+---+---+
        | 0 | 1 | 1 |
        +---+---+---+
        | 1 | 0 | 1 |
        +---+---+---+
        | 1 | 1 | 2 |
        +---+---+---+
        Ответить
        • Ну правильно, 2=10, то есть в младшем ноль.

          Их просто надрочили что XOR и сложение - одно и тоже, и там и там плюс. А вот момент что оно по модулю 2 почему-то упускают.
          Ответить
          • > XOR и сложение - одно и тоже
            ⊕1, к ним, похоже, пришел на собеседование математик, который знает, что такое поле, кольцо и идеал, а они его упустили.
            Ответить
          • намудрили придумали какие то сложности. это просто старое доброе !=
            Ответить
      • Кто-то не поленился ботом заминусить.
        Ответить

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