3 Commits

Author SHA1 Message Date
d93fbe33dc add converter docs 2023-11-14 20:00:09 +01:00
T.v.Dein
59241932e0 Feature/add converters and bitwise ops (#20)
* added:

- converters
- bitwise operators
- hex input and output support
2023-11-13 15:51:07 +01:00
T.v.Dein
127483eea1 Merge pull request #19 from TLINDEN/revert/exists
revert exists(), unused
2023-11-12 20:41:58 +01:00
7 changed files with 208 additions and 13 deletions

11
calc.go
View File

@@ -62,6 +62,8 @@ const Help string = `
Operators: Operators:
basic operators: + - x * / ^ (* is an alias of x) basic operators: + - x * / ^ (* is an alias of x)
Bitwise operators: and or xor < (left shift) > (right shift)
Percent functions: Percent functions:
% percent % percent
%- substract percent %- substract percent
@@ -235,6 +237,15 @@ func (c *Calc) Eval(line string) {
c.stack.Backup() c.stack.Backup()
c.stack.Push(num) c.stack.Push(num)
} else { } else {
// try hex
var i int
_, err := fmt.Sscanf(item, "0x%x", &i)
if err == nil {
c.stack.Backup()
c.stack.Push(float64(i))
continue
}
if contains(c.Constants, item) { if contains(c.Constants, item) {
// put the constant onto the stack // put the constant onto the stack
c.stack.Backup() c.stack.Backup()

View File

@@ -241,6 +241,45 @@ func TestCalc(t *testing.T) {
cmd: `4 4 + undo *`, cmd: `4 4 + undo *`,
exp: 16, exp: 16,
}, },
// bit tests
{
name: "bit and",
cmd: `1 3 and`,
exp: 1,
},
{
name: "bit or",
cmd: `1 3 or`,
exp: 3,
},
{
name: "bit xor",
cmd: `1 3 xor`,
exp: 2,
},
// converters
{
name: "inch-to-cm",
cmd: `111 inch-to-cm`,
exp: 281.94,
},
{
name: "gallons-to-liters",
cmd: `111 gallons-to-liters`,
exp: 420.135,
},
{
name: "meters-to-yards",
cmd: `111 meters-to-yards`,
exp: 1.2139107611548556,
},
{
name: "miles-to-kilometers",
cmd: `111 miles-to-kilometers`,
exp: 178.599,
},
} }
for _, tt := range tests { for _, tt := range tests {

View File

@@ -117,6 +117,15 @@ func (c *Calc) SetCommands() {
} }
}, },
), ),
"hex": NewCommand(
"show last stack item in hex form (converted to int)",
func(c *Calc) {
if c.stack.Len() > 0 {
fmt.Printf("0x%x\n", int(c.stack.Last()[0]))
}
},
),
} }
c.StackCommands = Commands{ c.StackCommands = Commands{

View File

@@ -387,6 +387,85 @@ func DefineFunctions() Funcalls {
return NewR(math.Hypot(arg[0], arg[1]), nil) return NewR(math.Hypot(arg[0], arg[1]), nil)
}, },
2), 2),
// converters of all kinds
"cm-to-inch": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]/2.54, nil)
},
1),
"inch-to-cm": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]*2.54, nil)
},
1),
"gallons-to-liters": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]*3.785, nil)
},
1),
"liters-to-gallons": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]/3.785, nil)
},
1),
"yards-to-meters": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]*91.44, nil)
},
1),
"meters-to-yards": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]/91.44, nil)
},
1),
"miles-to-kilometers": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]*1.609, nil)
},
1),
"kilometers-to-miles": NewFuncall(
func(arg Numbers) R {
return NewR(arg[0]/1.609, nil)
},
1),
"or": NewFuncall(
func(arg Numbers) R {
return NewR(float64(int(arg[0])|int(arg[1])), nil)
},
2),
"and": NewFuncall(
func(arg Numbers) R {
return NewR(float64(int(arg[0])&int(arg[1])), nil)
},
2),
"xor": NewFuncall(
func(arg Numbers) R {
return NewR(float64(int(arg[0])^int(arg[1])), nil)
},
2),
"<": NewFuncall(
func(arg Numbers) R {
return NewR(float64(int(arg[0])<<int(arg[1])), nil)
},
2),
">": NewFuncall(
func(arg Numbers) R {
return NewR(float64(int(arg[0])>>int(arg[1])), nil)
},
2),
} }
// aliases // aliases

View File

@@ -30,7 +30,7 @@ import (
lua "github.com/yuin/gopher-lua" lua "github.com/yuin/gopher-lua"
) )
const VERSION string = "2.0.9" const VERSION string = "2.0.10"
const Usage string = `This is rpn, a reverse polish notation calculator cli. const Usage string = `This is rpn, a reverse polish notation calculator cli.

45
rpn.go
View File

@@ -105,6 +105,9 @@ DESCRIPTION
If the first parameter to rpn is a math operator or function, batch mode If the first parameter to rpn is a math operator or function, batch mode
is enabled automatically, see last example. is enabled automatically, see last example.
You can enter integers, floating point numbers (positive or negative) or
hex numbers (prefixed with 0x).
STACK MANIPULATION STACK MANIPULATION
There are lots of stack manipulation commands provided. The most There are lots of stack manipulation commands provided. The most
important one is undo which goes back to the stack before the last math important one is undo which goes back to the stack before the last math
@@ -129,6 +132,14 @@ DESCRIPTION
x multiply (alias: *) x multiply (alias: *)
^ power ^ power
Bitwise operators:
and bitwise and
or bitwise or
xor bitwise xor
< left shift
> right shift
Percent functions: Percent functions:
% percent % percent
@@ -150,20 +161,34 @@ DESCRIPTION
log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0 log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0
y1 copysign dim hypot y1 copysign dim hypot
Commands: Conversion functions:
cm-to-inch
inch-to-cm
gallons-to-liters
liters-to-gallons
yards-to-meters
meters-to-yards
miles-to-kilometers
kilometers-to-miles
Configuration Commands:
[no]batch toggle batch mode (nobatch turns it off) [no]batch toggle batch mode (nobatch turns it off)
[no]debug toggle debug output (nodebug turns it off) [no]debug toggle debug output (nodebug turns it off)
[no]showstack show the last 5 items of the stack (noshowtack turns it off) [no]showstack show the last 5 items of the stack (noshowtack turns it off)
dump display the stack contents
clear clear the whole stack Show commands: dump display the stack contents hex show last stack item
shift remove the last element of the stack in hex form (converted to int) history display calculation history vars
reverse reverse the stack elements show list of variables
swap exchange the last two stack elements
dup duplicate last stack item Stack manipulation commands: clear clear the whole stack shift remove
history display calculation history the last element of the stack reverse reverse the stack elements swap
help|? show this message exchange the last two stack elements dup duplicate last stack item undo
quit|exit|c-d|c-c exit program undo last operation
Other commands: help|? show this message manual show manual
quit|exit|c-d|c-c exit program
Register variables: Register variables:

36
rpn.pod
View File

@@ -109,6 +109,9 @@ Example of batch mode usage:
If the first parameter to rpn is a math operator or function, batch If the first parameter to rpn is a math operator or function, batch
mode is enabled automatically, see last example. mode is enabled automatically, see last example.
You can enter integers, floating point numbers (positive or negative)
or hex numbers (prefixed with 0x).
=head2 STACK MANIPULATION =head2 STACK MANIPULATION
There are lots of stack manipulation commands provided. The most There are lots of stack manipulation commands provided. The most
@@ -136,6 +139,14 @@ Basic operators:
x multiply (alias: *) x multiply (alias: *)
^ power ^ power
Bitwise operators:
and bitwise and
or bitwise or
xor bitwise xor
< left shift
> right shift
Percent functions: Percent functions:
% percent % percent
@@ -157,19 +168,40 @@ Math functions:
log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0 log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0
y1 copysign dim hypot y1 copysign dim hypot
Commands: Conversion functions:
cm-to-inch
inch-to-cm
gallons-to-liters
liters-to-gallons
yards-to-meters
meters-to-yards
miles-to-kilometers
kilometers-to-miles
Configuration Commands:
[no]batch toggle batch mode (nobatch turns it off) [no]batch toggle batch mode (nobatch turns it off)
[no]debug toggle debug output (nodebug turns it off) [no]debug toggle debug output (nodebug turns it off)
[no]showstack show the last 5 items of the stack (noshowtack turns it off) [no]showstack show the last 5 items of the stack (noshowtack turns it off)
Show commands:
dump display the stack contents dump display the stack contents
hex show last stack item in hex form (converted to int)
history display calculation history
vars show list of variables
Stack manipulation commands:
clear clear the whole stack clear clear the whole stack
shift remove the last element of the stack shift remove the last element of the stack
reverse reverse the stack elements reverse reverse the stack elements
swap exchange the last two stack elements swap exchange the last two stack elements
dup duplicate last stack item dup duplicate last stack item
history display calculation history undo undo last operation
Other commands:
help|? show this message help|? show this message
manual show manual
quit|exit|c-d|c-c exit program quit|exit|c-d|c-c exit program