summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-20 21:38:40 +0200
committerPaul Buetow <paul@buetow.org>2026-03-20 21:38:40 +0200
commit8701f048229e0bbb2d97ba23a9ba38397eb70286 (patch)
tree4e76c410d8d8620ee0353fd1960f3c0ace76ac5d /cmd
parentf444b25bc2f7f92ab0bbd5411e7dd89f49fa25d2 (diff)
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 <expr> - Support variable assignment format: 'name value = expr...' - Fix assignment parsing to handle 'name value = expression' format - All tests pass, go vet passes
Diffstat (limited to 'cmd')
-rw-r--r--cmd/perc/main.go31
1 files changed, 30 insertions, 1 deletions
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 <calculation>")
+ fmt.Println(" perc calc <rpn-expression>")
+ fmt.Println(" perc rpn <rpn-expression>")
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")
}