aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--func.go71
1 files changed, 21 insertions, 50 deletions
diff --git a/func.go b/func.go
index d0cd11e..e3bb8d7 100644
--- a/func.go
+++ b/func.go
@@ -13,23 +13,35 @@ func parseFunction(fn string) func(*Calculator) {
case "asin", "acos", "atan":
return invTrig(fn)
case "deg":
- return deg
+ return apply(radToDeg)
case "rad":
- return rad
+ return apply(degToRad)
case "fac":
return fac
case "ch": // choose
return combination
case "log10":
- return log10
+ return apply(math.Log10)
case "log2":
- return log2
+ return apply(math.Log2)
case "ln":
- return ln
+ return apply(math.Log)
}
return nil
}
+// apply returns a function that applies fn to the bottom stack element of the
+// calculator.
+func apply(fn func(float64) float64) func(*Calculator) {
+ return func(c *Calculator) {
+ x, err := c.stack.pop()
+ if err != nil {
+ return
+ }
+ c.stack.push(fn(x))
+ }
+}
+
// trig returns a closure that performs the trig function specified by fn.
// Panics if fn is not one of "sin", "cos" or "tan".
func trig(fn string) func(*Calculator) {
@@ -79,18 +91,12 @@ func invTrig(fn string) func(*Calculator) {
}
}
-// Convert radians to degrees.
-func deg(c *Calculator) {
- if n, err := c.stack.pop(); err == nil {
- c.stack.push(radToDeg(n))
- }
+func degToRad(deg float64) (rad float64) {
+ return deg * math.Pi / 180.0
}
-// Convert degrees to radians.
-func rad(c *Calculator) {
- if n, err := c.stack.pop(); err == nil {
- c.stack.push(degToRad(n))
- }
+func radToDeg(rad float64) (deg float64) {
+ return rad * 180 / math.Pi
}
// Factorial (!).
@@ -136,14 +142,6 @@ func combination(c *Calculator) {
}
}
-func degToRad(deg float64) (rad float64) {
- return deg * math.Pi / 180.0
-}
-
-func radToDeg(rad float64) (deg float64) {
- return rad * 180 / math.Pi
-}
-
// factorial returns n! (n factorial).
func factorial(n uint) uint {
if n == 0 { // 0! = 1
@@ -156,33 +154,6 @@ func factorial(n uint) uint {
return n
}
-// decimal logarithm.
-func log10(c *Calculator) {
- x, err := c.stack.pop()
- if err != nil {
- return
- }
- c.stack.push(math.Log10(x))
-}
-
-// binary logarithm.
-func log2(c *Calculator) {
- x, err := c.stack.pop()
- if err != nil {
- return
- }
- c.stack.push(math.Log2(x))
-}
-
-// natural logarithm.
-func ln(c *Calculator) {
- x, err := c.stack.pop()
- if err != nil {
- return
- }
- c.stack.push(math.Log(x))
-}
-
func isUint(n float64) bool {
return float64(uint(n)) == n
}