Skip to content

Commit

Permalink
added swap stack command, bump version (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
TLINDEN authored Nov 6, 2023
1 parent b543040 commit dac5c09
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 17 deletions.
25 changes: 10 additions & 15 deletions calc.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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`
)

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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":
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 3 additions & 1 deletion rpn.pod
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ You can use B<dump> to display the stack. If debugging
is enabled (C<-d> switch or B<debug> toggle command), then the backup
stack is also being displayed.

The stack can be reversed using the B<reverse> command.
The stack can be reversed using the B<reverse> command. However,
sometimes only the last two values are in the wrong order. Use the
B<swap> command to exchange them.

You can use the B<shift> command to remove the last number from the
stack.
Expand Down
20 changes: 20 additions & 0 deletions stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down

0 comments on commit dac5c09

Please sign in to comment.