From 7d0443ce4b0dfcf1dc1b6cff4c2d3cc719962c1f Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 9 Nov 2023 18:34:00 +0100 Subject: [PATCH 1/5] bump version --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index d9ad1c8..77cde08 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ import ( lua "github.com/yuin/gopher-lua" ) -const VERSION string = "2.0.6" +const VERSION string = "2.0.7" const Usage string = `This is rpn, a reverse polish notation calculator cli. From 7b656c492ae76c1129bd5bf9d16a24d8803b878d Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 9 Nov 2023 18:34:07 +0100 Subject: [PATCH 2/5] fix reverse and backup&restore --- stack.go | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/stack.go b/stack.go index 2a6ab4e..3d73fd3 100644 --- a/stack.go +++ b/stack.go @@ -195,14 +195,20 @@ func (s *Stack) Backup() { // make a backup, because the elements in list.List{} are pointers // and lead to unexpected results. The methid here works reliably // at least. + s.mutex.Lock() + defer s.mutex.Unlock() + s.backup = list.List{} for e := s.linklist.Front(); e != nil; e = e.Next() { - s.backup.PushBack(e.Value) + s.backup.PushBack(e.Value.(float64)) } s.backuprev = s.rev } func (s *Stack) Restore() { + s.mutex.Lock() + defer s.mutex.Unlock() + if s.rev == 0 { fmt.Println("error: stack is empty.") return @@ -211,15 +217,26 @@ func (s *Stack) Restore() { s.Debug(fmt.Sprintf("restoring stack to revision %d", s.backuprev)) s.rev = s.backuprev - s.linklist = s.backup + + s.linklist = list.List{} + for e := s.backup.Front(); e != nil; e = e.Next() { + s.linklist.PushBack(e.Value.(float64)) + } } func (s *Stack) Reverse() { - newstack := list.List{} + s.mutex.Lock() + defer s.mutex.Unlock() + + items := []float64{} for e := s.linklist.Front(); e != nil; e = e.Next() { - newstack.PushFront(e.Value) + tail := s.linklist.Back() + items = append(items, tail.Value.(float64)) + s.linklist.Remove(tail) } - s.linklist = newstack + for i := len(items) - 1; i >= 0; i-- { + s.linklist.PushFront(items[i]) + } } From a6f8a0fdbe0cecffc163ebbbf9e2eb915c286403 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 9 Nov 2023 18:34:29 +0100 Subject: [PATCH 3/5] renamed luafunc() --- calc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/calc.go b/calc.go index d9d2275..7177a2e 100644 --- a/calc.go +++ b/calc.go @@ -259,7 +259,7 @@ func (c *Calc) Eval(line string) { if contains(c.LuaFunctions, item) { // user provided custom lua functions - c.luafunc(item) + c.EvalLuaFunction(item) continue } @@ -442,7 +442,7 @@ func (c *Calc) Debug(msg string) { } } -func (c *Calc) luafunc(funcname string) { +func (c *Calc) EvalLuaFunction(funcname string) { // called from calc loop var x float64 var err error From b91e02456926e74e1f7d02b325327be8af5e8601 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 9 Nov 2023 18:34:38 +0100 Subject: [PATCH 4/5] added more tests --- calc_test.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/calc_test.go b/calc_test.go index b8f48c3..9ffe0cd 100644 --- a/calc_test.go +++ b/calc_test.go @@ -20,6 +20,8 @@ package main import ( "fmt" "testing" + + lua "github.com/yuin/gopher-lua" ) func TestCommentsAndWhitespace(t *testing.T) { @@ -104,6 +106,7 @@ func TestCalc(t *testing.T) { exp float64 batch bool }{ + // ops { name: "plus", cmd: `15 15 +`, @@ -144,6 +147,8 @@ func TestCalc(t *testing.T) { cmd: `400 20 %+`, exp: 480, }, + + // math tests { name: "mod", cmd: `9 2 mod`, @@ -164,6 +169,20 @@ func TestCalc(t *testing.T) { cmd: `6 4 dim`, exp: 2, }, + + // constants tests + { + name: "pitimes2", + cmd: `Pi 2 *`, + exp: 6.283185307179586, + }, + { + name: "pi+sqrt2", + cmd: `Pi Sqrt2 +`, + exp: 4.555806215962888, + }, + + // batch tests { name: "batch-sum", cmd: `2 2 2 2 sum`, @@ -194,6 +213,29 @@ func TestCalc(t *testing.T) { exp: 5, batch: true, }, + + // stack tests + { + name: "use-vars", + cmd: `10 >TEN clear 5 Date: Thu, 9 Nov 2023 18:47:31 +0100 Subject: [PATCH 5/5] added debug output to Backup() --- calc.go | 4 ++++ calc_test.go | 5 +++++ stack.go | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/calc.go b/calc.go index 7177a2e..82bda08 100644 --- a/calc.go +++ b/calc.go @@ -393,6 +393,10 @@ func (c *Calc) DoFuncall(funcname string) error { return R.Err } + // don't forget to backup! + c.stack.Backup() + + // "pop" if batch { // get rid of stack c.stack.Clear() diff --git a/calc_test.go b/calc_test.go index 9ffe0cd..a5e0958 100644 --- a/calc_test.go +++ b/calc_test.go @@ -236,6 +236,11 @@ func TestCalc(t *testing.T) { exp: 2, batch: true, }, + { + name: "undo", + cmd: `4 4 + undo *`, + exp: 16, + }, } for _, tt := range tests { diff --git a/stack.go b/stack.go index 3d73fd3..c853db0 100644 --- a/stack.go +++ b/stack.go @@ -198,10 +198,14 @@ func (s *Stack) Backup() { s.mutex.Lock() defer s.mutex.Unlock() + s.Debug(fmt.Sprintf("backing up %d items from rev %d", + s.linklist.Len(), s.rev)) + s.backup = list.List{} for e := s.linklist.Front(); e != nil; e = e.Next() { s.backup.PushBack(e.Value.(float64)) } + s.backuprev = s.rev }