- 1
- 2
- 3
- 4
- 5
- 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
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
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"
Выводит: «TRUE».
https://ideone.com/jsms0G
Так всё алголо- фортано- подобное дерьмо этим старадает.
В лиспах, фортах и коболе инфиксопроблем нет.
Форт-программа же сама себя парсит и конпелирует:https://ideone.com/Ys1f2d
Пример же просто, для работы с приоритетами придётся как-то обозначать конец выражения, чтобы отложенные операции выполнить. Да и лень мне.
Хотя, наверное, для более удобного использования лучше придумать для инфиксушни конструкцию по примеру tcl. Что-то типа:
На «бухгалтерских» 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) вместо указателей на код, но не стандартизировали как получить по нему собсно адрес кода, и совать его в стек развратов не везде проканает. Как вариант решения: оператор перед выполнением опереции может сам заглядывать вперёд и вызывать следующий оператор, если его приоритет выше, так "операция" (адрес разврата) сама на стеке останется.
Стек на джва числа... А зачем им стек операций если нет приоритетов - х.з.
Иначе выражение-будет-воспринято-как-единое-целое.
В принципе баш с его педерачей данных через пайпы тоже в своем роде монадичен.
Пример (отсюда - 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,
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 хватает для подобных вещей.
Как я понял они заявляют что их главные киллер-фича — обработка ошибок и ультракороткая обработка строк.
Ну думаю какой-нибудь хаскель с монадами его уделает по краткости и выразительности.
Ещё в иконе исполнения зависит от успех/не успех предыддущей опереции, как в комменте децктопа выше.