From 8701f048229e0bbb2d97ba23a9ba38397eb70286 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 20 Mar 2026 21:38:40 +0200 Subject: internal/rpn/cmd/perc: add calc/rpn subcommands and fix assignment handling - Add calc and rpn subcommands to main.go - Support RPN expression evaluation via perc calc/rpn - Support variable assignment format: 'name value = expr...' - Fix assignment parsing to handle 'name value = expression' format - All tests pass, go vet passes --- cmd/perc/main.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'cmd') diff --git a/cmd/perc/main.go b/cmd/perc/main.go index a9faf76..d33593c 100644 --- a/cmd/perc/main.go +++ b/cmd/perc/main.go @@ -7,6 +7,7 @@ import ( "codeberg.org/snonux/perc/internal" "codeberg.org/snonux/perc/internal/calculator" + "codeberg.org/snonux/perc/internal/rpn" "codeberg.org/snonux/perc/internal/repl" "github.com/mattn/go-isatty" ) @@ -41,6 +42,19 @@ func runCommand(args []string) (string, error) { return "", nil } + // Check for calc subcommand + if args[1] == "calc" || args[1] == "rpn" { + if len(args) < 3 { + return "", fmt.Errorf("missing expression after '%s'", args[1]) + } + input := strings.Join(args[2:], " ") + result, err := runRPN(input) + if err != nil { + return "", err + } + return result, nil + } + input := strings.Join(args[1:], " ") result, err := calculator.Parse(input) if err != nil { @@ -50,15 +64,30 @@ func runCommand(args []string) (string, error) { return result, nil } +// runRPN parses and evaluates an RPN expression +func runRPN(input string) (string, error) { + vars := rpn.NewVariables().(*rpn.Variables) + rpnCalc := rpn.NewRPN(vars) + return rpnCalc.ParseAndEvaluate(input) +} + func printUsage() { fmt.Println("Usage: perc ") + fmt.Println(" perc calc ") + fmt.Println(" perc rpn ") fmt.Println(" perc version") fmt.Println(" perc [--repl|repl]") - fmt.Println("\nExamples:") + fmt.Println("\nPercentage calculator examples:") fmt.Println(" perc 20% of 150") fmt.Println(" perc what is 20% of 150") fmt.Println(" perc 30 is what % of 150") fmt.Println(" perc 30 is 20% of what") + fmt.Println("\nRPN (postfix notation) examples:") + fmt.Println(" perc calc 3 4 +") + fmt.Println(" perc calc 3 4 + 4 4 - *") + fmt.Println(" perc calc x = 5 x x +") + fmt.Println(" perc calc 2 3 ^") + fmt.Println(" perc calc dup swap pop show") fmt.Println("\nStart REPL mode interactively by running without arguments:") fmt.Println(" perc") } -- cgit v1.2.3