diff --git a/calc.go b/calc.go index c131a7d..038b439 100644 --- a/calc.go +++ b/calc.go @@ -51,6 +51,8 @@ debug toggle debug output dump display the stack contents clear clear the whole stack shift remove the last element of the stack +reverse reverse the stack elements +swap exchange the last two elements history display calculation history help|? show this message quit|exit|c-d|c-c exit program @@ -79,7 +81,7 @@ median median of all values` // commands, constants and operators, defined here to feed completion // and our mode switch in Eval() dynamically const ( - Commands string = `dump reverse debug undebug clear batch shift undo help history manual exit quit` + Commands string = `dump reverse debug undebug clear batch shift undo help history manual exit quit swap` Constants string = `Pi Phi Sqrt2 SqrtE SqrtPi SqrtPhi Ln2 Log2E Ln10 Log10E` ) @@ -191,20 +193,6 @@ func (c *Calc) Eval(line string) { c.stack.Backup() c.stack.Push(num) } else { - /* - if contains(c.MathFunctions, item) { - // go builtin math function, if implemented - c.mathfunc(item) - continue - } - - if contains(c.BatchFunctions, item) { - // math functions only supported in batch mode like max or mean - c.batchfunc(item) - continue - } - */ - if contains(c.Constants, item) { // put the constant onto the stack c.stack.Backup() @@ -270,6 +258,13 @@ func (c *Calc) Eval(line string) { case "reverse": c.stack.Backup() c.stack.Reverse() + case "swap": + if c.stack.Len() < 2 { + fmt.Println("stack too small, can't swap") + } else { + c.stack.Backup() + c.stack.Swap() + } case "undo": c.stack.Restore() case "history": diff --git a/main.go b/main.go index 2a75403..2d180be 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ import ( lua "github.com/yuin/gopher-lua" ) -const VERSION string = "2.0.1" +const VERSION string = "2.0.2" const Usage string = `This is rpn, a reverse polish notation calculator cli. diff --git a/rpn.pod b/rpn.pod index d37e285..93b293a 100644 --- a/rpn.pod +++ b/rpn.pod @@ -116,7 +116,9 @@ You can use B to display the stack. If debugging is enabled (C<-d> switch or B toggle command), then the backup stack is also being displayed. -The stack can be reversed using the B command. +The stack can be reversed using the B command. However, +sometimes only the last two values are in the wrong order. Use the +B command to exchange them. You can use the B command to remove the last number from the stack. diff --git a/stack.go b/stack.go index b4105f1..2a6ab4e 100644 --- a/stack.go +++ b/stack.go @@ -115,6 +115,26 @@ func (s *Stack) Shift(num ...int) { } } +func (s *Stack) Swap() { + s.mutex.Lock() + defer s.mutex.Unlock() + + if s.linklist.Len() < 2 { + return + } + + a := s.linklist.Back() + s.linklist.Remove(a) + + b := s.linklist.Back() + s.linklist.Remove(b) + + s.Debug(fmt.Sprintf("swapping %.2f with %.2f", b.Value, a.Value)) + + s.linklist.PushBack(a.Value) + s.linklist.PushBack(b.Value) +} + // Return the last num items from the stack w/o modifying it. func (s *Stack) Last(num ...int) []float64 { items := []float64{}