Pull to refresh

Comments 9

Как-то пахнуло Turbo Pascal и лабами с первого семестра.
Если уже Котлин — то, как мне кажется, нужно стараться делать идиоматично.
Всякие иммутабельности, ФП, можно еще библиотеки типа arrow прикрутить, это же доя себя задачка.
А просто ифов написать с регекспами — разницы с тем же питоном особо нет, разве что скобки, но в питоне со списками красивее даже выйдет, если влоб делать.

Это просто пример на Kotlin не более. Написан специально как можно проще, что бы новичку было понятно как это работает. Смысл статьи в алгоритме, который можно реализовать на любом языке.

В чём смысл, если эти алгоритмы уже реализованы на всевозможных языках?

Что бы понять как он работает.
Ужасный, никому не нужный велосипед. Берем любой готовый инструмент, например для создания PEG парсеров, и получаем код примерно того же объема, который будет существенно проще расширяться, и намного лучше читаться.
Я вас не понял, причем здесь другие инструменты? Я просто описал алгоритм преобразования из инфиксной записи в постфиксную. А по коду на Kotlin, если использовать все возможности Kotlin, то код был бы меньше, но понять его было бы труднее.
Попробуйте добавить в свой калькулятор возведение в степень, или функции. Останутся от кода рожки да ножки. Мораль — велосипед барахло, не нужно такие писать, и тем более не нужно таким хвалиться.
Я рад, что вы заинтересовались моей первой публикацией на хабре.
Но хотел бы вам, возразить. Во-первых, я ни коим образом не хвалюсь, так как алгоритм придумал не я, я его просто описал. Если вам не интересно, можете не обращать внимания и пройти мимо. Я думаю, что кому-то это пригодится.
Во-вторых, специально для вас я добавил в код несколько строчек и он уже легко считает возведение в степень. Так как возведение в степень имеет более высокий приоритет чем +-*/.
функция getPostFixEx
    // Добавляем новое условие
         it == "^" -> {
               push(it)
         }


функция calcPostFix
item == "^" -> {
    stack[stack.lastIndex - 1] = (stack[stack.lastIndex - 1].toDouble()
                                             .pow(stack.last())).toInt()
    stack.removeAt(stack.lastIndex)
}

Так как возведение в степень имеет более высокий приоритет чем +-*/. Для возведения в степень необходимо добавить пару строк в код.
функция getPostFixEx
    // Добавляем новое условие
         it == "^" -> {
               push(it)
         }


функция calcPostFix
item == "^" -> {
    stack[stack.lastIndex - 1] = (stack[stack.lastIndex - 1].toDouble()
                                             .pow(stack.last())).toInt()
    stack.removeAt(stack.lastIndex)
}

Sign up to leave a comment.

Articles