1. Куча / Говнокод #26420

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    PHP
    print 3 --0-- 5 == 8; // Parse error
    Java Script
    console.log(3 --0-- 5 == 8); // Uncaught SyntaxError: Invalid left-hand side expression in postfix operation
    Python
    print(3 --0-- 5 == 8) // true

    Именно поэтому я за "PHP" и "Java Script"

    Запостил: phpBidlokoder2, 07 Февраля 2020

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

    • Прогрмааы не эквивалентны, в питоне нет дектременов
      3 - -0 - -5
      Ответить
    • «Паскаль»:
      begin
      WriteLn(3 --0-- 5 = 8)
      end.


      Выводит: «TRUE».

      https://ideone.com/jsms0G
      Ответить
      • "Ruby" туда же https://ideone.com/nSSViv
        Ответить
        • Не удивительно, языки для быдла, то ли дело ванильный node.js
          Ответить
          • >языки для быдла
            Так всё алголо- фортано- подобное дерьмо этим старадает.

            В лиспах, фортах и коболе инфиксопроблем нет.
            Ответить
            • В форте инфиксопроблем без проблем можно добавить.
              Ответить
              • А каких ещё проблем можно добавить в «Форте» без проблем?
                Ответить
              • А как? Форт же постфиксный.
                Ответить
                • Постфиксный только основной набор слов, и то не все.

                  Форт-программа же сама себя парсит и конпелирует:
                  wordlist constant prefix-wl  \ словарь префиксных операторов
                  wordlist constant infix-wl  \ словарь инфиксных операторов
                  
                  \ вспомогательные слова для работы с контекстом поиска
                  : set-top  ( wid -- )
                      >r get-order nip r> swap set-order ;
                  : infix  infix-wl set-top ;
                  : prefix  prefix-wl set-top ;
                  
                  : create-in-wordlist  ( wid "name" -- )
                      \ создать определение в определённом словаре
                      get-current swap set-current
                      create
                      set-current ;
                  
                  : eval-word  ( i*x c-addr -- j*x )
                      \ как evaluate, но для одного слова и в контексте исходной строки
                      find if
                          state @  if  compile,  else  execute  then
                      else
                          count evaluate
                      then ;
                  
                  : prefix:  ( xt "name" -- )
                      \ создать для xt определение в префиксном словаре
                      prefix-wl create-in-wordlist ,
                      does>
                          @ >r
                          bl word eval-word
                          r> execute
                          infix ;
                  
                  : infix:  ( xt "name" -- )
                      \ создать для xt определение в инфиксном словаре
                      infix-wl create-in-wordlist ,
                      does>
                          @ >r
                          prefix
                          bl word eval-word
                          r> execute ;
                  
                  ' - infix: -
                  ' negate prefix: -
                  
                  also infix
                  
                  \ test
                  3 - - 0 - - 5 .  \ 8
                  https://ideone.com/Ys1f2d
                  Ответить
                  • Добавь поддержку приоритетов. Без них инфиксушня нинужна.
                    Ответить
                    • Напомнило «Sphinx C--», в котором арифметические операции были без приоритетов, выполнялись тупо слева направо.
                      Ответить
                      • Приоритеты придумали анскильные математики, которым лень писать лишние закорючки и скобочки.
                        Ответить
                        • А поскольку математику изучают только в рашке, все языки программирования с приоритетами нужны только ватникам.
                          Ответить
                          • Именно поэтому я за «Путина».
                            Ответить
                          • В рашке математику изучал только один безработный живущий с мамкой еврей Перельман. И даже он пришел к успеху и съебал в Шведен. Отрицательный отбор не останавливается ни на минуту.
                            Ответить
                    • Точно, Smalltalk и SphinxC-- не нужны.

                      Пример же просто, для работы с приоритетами придётся как-то обозначать конец выражения, чтобы отложенные операции выполнить. Да и лень мне.

                      Хотя, наверное, для более удобного использования лучше придумать для инфиксушни конструкцию по примеру tcl. Что-то типа:
                      : expr"
                          [char] " parse
                          \\ тут просто парсим и вычисляем/конпеляем строку
                          \\ ну или ставим в порядок поиска словари с операторами как в примере выше и говорим evaluate
                      ;
                      
                      expr" 3 - - 0 - - 5"
                      Ответить
                      • Есть два типа простых непрограммируемых калькуляторов: «бухгалтерские» и «инженерные». Есть программируемые: с обратной бесскобочной записью (она же польская, она же RPN, с алгебраической записью (она же ARE), со встроенными ЯП.

                        На «бухгалтерских» 2+2*2 = 8, потому приоритетов нет.
                        На «инженерных» 2+2*2 = 6, потому что есть приоритет.
                        На калькуляторах с ARE арифметические выражения выглядят так же, как на «инженерных», разница будет только в выражениях с тригонометрическими функциями, логарифмами и т. п.
                        На калькуляторах с RPN запись будет выглядеть по-другому. Например, 2↑2↑2+* = 8; 2↑2↑2*+ = 6; 2↑2+2* = 8; 2↑2*2+ = 6.

                        Как это работает?
                        У калькуляторов с RPN стек один: для чисел. Знак двухместной операции (+, -, *, /) немедленно достаёт из стека два числа, производит с ними вычисления и результат кладёт в стек.

                        У бухгалтерских и у инженерных калькуляторов стека два. Второй стек — для операций. Разница между ними в том, что у бухгалтерского знак операции всегда достаёт из стека знак предыдущей операции и два числа и производит над ними вычисления, а у инженерного предварительно производится сравнение приоритетов. Если у предыдущей операции приоритет ниже, то всё движется дальше в стек и ничего не вычисляется. Если же у прерыдущей операции приоритет выше, то производятся вычисления, как на бухгалтерском.

                        Реальный пример: 2 + 2 * 2 =
                        2 // кладём в стек двойку
                        + // кладём во второй стек +
                        2 // кладём в стек двойку
                        * // приоритет + ниже, чем у * => кладём в стек *
                        2 // кладём в стек двойку
                        = // извлекаем из второго стека знаки операций и производим вычисления, пока второй стек не опустеет
                        // извлекли * => считаем 2 * 2
                        // извлекли + => считаем 2 + 2

                        Второй реальный пример: 2 * 2 + 2 =
                        2 // кладём в стек двойку
                        * // кладём во второй стек *
                        2 // кладём в стек двойку
                        + // приоритет * выше, чем у + => извлекаем из второго стека *, вычисляем 2*2, кладём во второй стек +
                        2 // кладём в стек двойку
                        = // извлекаем из второго стека +, вычисляем 4 + 2
                        Ответить
                        • >Есть два типа простых непрограммируемых калькуляторов:

                          Какой бы ты использовал сам, а какой посоветовал бы матери?
                          Ответить
                        • Не понятно, зачем бухгалтерскому стек. Разве нельзя сразу же посчитать? Или там есть питушня со скобочками?

                          Кстати, в форте можно было бы использовать стек развратов как стек для опереторов, но стандартизаторы из-за большого обилия видов промежуткого кода придумали какую-то хуню в виде xt (execution term) вместо указателей на код, но не стандартизировали как получить по нему собсно адрес кода, и совать его в стек развратов не везде проканает. Как вариант решения: оператор перед выполнением опереции может сам заглядывать вперёд и вызывать следующий оператор, если его приоритет выше, так "операция" (адрес разврата) сама на стеке останется.
                          Ответить
                          • > зачем бухгалтерскому стек

                            Стек на джва числа... А зачем им стек операций если нет приоритетов - х.з.
                            Ответить
                            • Если скобочек нет, то «стек» на одну операцию. Т. е. тупо одна ячейка. Стеком я назвал, чтобы было удобнее сравнивать с инженерным.
                              Ответить
                              • Не одна, а две. Верхушку стека ты видишь на экране.
                                Ответить
      • А в Дилане знаки операций нужно выделять пробелами.
        Иначе выражение-будет-воспринято-как-единое-целое.
        Ответить
        • Ты Icon никогда не щупал?
          Ответить
          • Не. А чем он знаменит?
            Ответить
            • https://govnokod.ru/24847#comment438486
              Ответить
              • На монаду Either похоже.

                В принципе баш с его педерачей данных через пайпы тоже в своем роде монадичен.
                Ответить
                • именноп о этому я за перл с его

                  fuck or die
                  see(Paris) and die
                  Ответить
                • Монады какие-то, вореции. Пиехавший!
                  Ответить
            • Вроде как создан для обработки текстов. Википидоры даже что-то писали про компиляторы, но тут закрадываются сомнения.

              Пример (отсюда - https://www2.cs.arizona.edu/icon/docs/ipd266.htm):

              String analysis functions such as find() can be used in string scanning. In this context, the string that they operate on is not specified and is taken to be the subject. For example,

              line ? while write(tab(find("or")))
                     do move(2)


              writes all the substrings of line prior to occurrences of "or". Note that find() produces a position, which is then used by tab() to change the position and produce the desired substring. The move(2) skips the "or" that is found.
              Ответить
              • Не знаю.
                Мне обычно grep | awk | sed хватает для подобных вещей.

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

              Ещё в иконе исполнения зависит от успех/не успех предыддущей опереции, как в комменте децктопа выше.
              Ответить

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