- converters
- bitwise operators
- hex input and output support
This commit is contained in:
2023-11-13 11:02:38 +01:00
parent 127483eea1
commit ad3a49715c
5 changed files with 136 additions and 2 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

@@ -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

3
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

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