4 Commits

Author SHA1 Message Date
d9a0d61efc use generics for contains() and add generic exists() 2023-12-07 12:16:49 +01:00
T.v.Dein
d2db420837 Merge pull request #25 from TLINDEN/doc/fix-formating
fix pod formatting (fixes #24)
2023-12-05 20:09:42 +01:00
T.v.Dein
b4f53d2dd6 Merge pull request #26 from TLINDEN/feature/add-shortcuts
added a couple of command shortcuts
2023-12-05 20:06:05 +01:00
ec4d86f727 added a couple of shortcuts 2023-12-05 20:01:32 +01:00
5 changed files with 72 additions and 27 deletions

34
calc.go
View File

@@ -121,20 +121,28 @@ func (c *Calc) GetCompleteCustomFuncalls() func(string) []string {
} }
for command := range c.SettingsCommands { for command := range c.SettingsCommands {
if len(command) > 1 {
completions = append(completions, command) completions = append(completions, command)
} }
}
for command := range c.ShowCommands { for command := range c.ShowCommands {
if len(command) > 1 {
completions = append(completions, command) completions = append(completions, command)
} }
}
for command := range c.StackCommands { for command := range c.StackCommands {
if len(command) > 1 {
completions = append(completions, command) completions = append(completions, command)
} }
}
for command := range c.Commands { for command := range c.Commands {
if len(command) > 1 {
completions = append(completions, command) completions = append(completions, command)
} }
}
return completions return completions
} }
@@ -253,7 +261,7 @@ func (c *Calc) Eval(line string) {
continue continue
} }
if _, ok := c.Funcalls[item]; ok { if exists(c.Funcalls, item) {
if err := c.DoFuncall(item); err != nil { if err := c.DoFuncall(item); err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -262,8 +270,12 @@ func (c *Calc) Eval(line string) {
continue continue
} }
if c.batch { if exists(c.BatchFuncalls, item) {
if _, ok := c.BatchFuncalls[item]; ok { if !c.batch {
fmt.Println("only supported in batch mode")
continue
}
if err := c.DoFuncall(item); err != nil { if err := c.DoFuncall(item); err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -271,12 +283,6 @@ func (c *Calc) Eval(line string) {
} }
continue continue
} }
} else {
if _, ok := c.BatchFuncalls[item]; ok {
fmt.Println("only supported in batch mode")
continue
}
}
if contains(c.LuaFunctions, item) { if contains(c.LuaFunctions, item) {
// user provided custom lua functions // user provided custom lua functions
@@ -296,22 +302,22 @@ func (c *Calc) Eval(line string) {
} }
// internal commands // internal commands
if _, ok := c.Commands[item]; ok { if exists(c.Commands, item) {
c.Commands[item].Func(c) c.Commands[item].Func(c)
continue continue
} }
if _, ok := c.ShowCommands[item]; ok { if exists(c.ShowCommands, item) {
c.ShowCommands[item].Func(c) c.ShowCommands[item].Func(c)
continue continue
} }
if _, ok := c.StackCommands[item]; ok { if exists(c.StackCommands, item) {
c.StackCommands[item].Func(c) c.StackCommands[item].Func(c)
continue continue
} }
if _, ok := c.SettingsCommands[item]; ok { if exists(c.SettingsCommands, item) {
c.SettingsCommands[item].Func(c) c.SettingsCommands[item].Func(c)
continue continue
} }
@@ -499,7 +505,7 @@ func (c *Calc) PutVar(name string) {
} }
func (c *Calc) GetVar(name string) { func (c *Calc) GetVar(name string) {
if _, ok := c.Vars[name]; ok { if exists(c.Vars, name) {
c.Debug(fmt.Sprintf("retrieve %.2f from %s", c.Vars[name], name)) c.Debug(fmt.Sprintf("retrieve %.2f from %s", c.Vars[name], name))
c.stack.Backup() c.stack.Backup()
c.stack.Push(c.Vars[name]) c.stack.Push(c.Vars[name])

View File

@@ -305,6 +305,15 @@ func (c *Calc) SetCommands() {
// aliases // aliases
c.Commands["quit"] = c.Commands["exit"] c.Commands["quit"] = c.Commands["exit"]
c.SettingsCommands["undebug"] = c.SettingsCommands["nodebug"]
c.SettingsCommands["show"] = c.SettingsCommands["showstack"] c.SettingsCommands["d"] = c.SettingsCommands["debug"]
c.SettingsCommands["b"] = c.SettingsCommands["batch"]
c.SettingsCommands["s"] = c.SettingsCommands["showstack"]
c.ShowCommands["h"] = c.ShowCommands["history"]
c.ShowCommands["p"] = c.ShowCommands["dump"]
c.ShowCommands["v"] = c.ShowCommands["vars"]
c.StackCommands["c"] = c.StackCommands["clear"]
c.StackCommands["u"] = c.StackCommands["undo"]
} }

11
rpn.go
View File

@@ -208,6 +208,17 @@ DESCRIPTION
Refer to https://pkg.go.dev/math for details about those functions. Refer to https://pkg.go.dev/math for details about those functions.
There are also a number of shortcuts for some commands available:
d debug
b batch
s showstack
h history
p dump (aka print)
v vars
c clear
u undo
INTERACTIVE REPL INTERACTIVE REPL
While you can use rpn in the command-line, the best experience you'll While you can use rpn in the command-line, the best experience you'll
have is the interactive repl (read eval print loop). Just execute "rpn" have is the interactive repl (read eval print loop). Just execute "rpn"

11
rpn.pod
View File

@@ -216,6 +216,17 @@ Register variables:
Refer to https://pkg.go.dev/math for details about those functions. Refer to https://pkg.go.dev/math for details about those functions.
There are also a number of shortcuts for some commands available:
d debug
b batch
s showstack
h history
p dump (aka print)
v vars
c clear
u undo
=head1 INTERACTIVE REPL =head1 INTERACTIVE REPL
While you can use rpn in the command-line, the best experience you'll While you can use rpn in the command-line, the best experience you'll

16
util.go
View File

@@ -23,16 +23,24 @@ import (
"strings" "strings"
) )
// find an item in a list // find an item in a list, generic variant
func contains(s []string, e string) bool { func contains[E comparable](s []E, v E) bool {
for _, a := range s { for _, vs := range s {
if a == e { if v == vs {
return true return true
} }
} }
return false return false
} }
// look if a key in a map exists, generic variant
func exists[K comparable, V any](m map[K]V, v K) bool {
if _, ok := m[v]; ok {
return true
}
return false
}
func const2num(name string) float64 { func const2num(name string) float64 {
switch name { switch name {
case "Pi": case "Pi":