Solution: Reverse Polish Calculator



examples/rpc/rpc.go
package main

import (
    "fmt"
    "log"
    "os"
    "strconv"
    "strings"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Printf("Usage: %s EXPRESSION (put the whole thing in quotes)\n", os.Args[0])
        os.Exit(1)
    }
    expression := os.Args[1]
    //fmt.Println(expression)
    parts := strings.Fields(expression)
    //fmt.Println(parts)
    //fmt.Println(len(parts))
    result := rpc(parts)
    fmt.Println(result)

}

func rpc(parts []string) float64 {
    stack := []float64{}
    for _, value := range parts {
        //fmt.Println(value)
        if value == "=" {
            log.Println("=")
            if len(stack) == 0 {
                panic("Operator = received and we have no value to print")
            }
            a := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            return a
        }
        if value == "+" || value == "*" || value == "-" || value == "/" {
            log.Println(value)
            if len(stack) < 2 {
                panic("Operator + received too early")
            }
            b := stack[len(stack)-1]
            a := stack[len(stack)-2]
            var c float64
            switch value {
            case "+":
                c = a + b
            case "-":
                c = a - b
            case "*":
                c = a * b
            case "/":
                c = a / b
            default:
                panic("How could this happen?")
            }

            stack = stack[:len(stack)-2]
            stack = append(stack, c)
            continue
        }
        number, err := strconv.ParseFloat(value, 64)
        if err != nil {
            panic(fmt.Sprintf("Unhandled value %v", value))
        }
        log.Println(number)
        stack = append(stack, number)
    }
    return 0
}