summaryrefslogtreecommitdiff
path: root/internal/rpn/boolean_ops.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-11 20:53:58 +0300
committerPaul Buetow <paul@buetow.org>2026-04-11 20:53:58 +0300
commit4465f7abdc72887a422b2ddd9afc43ee811b2e9b (patch)
tree98182a806c34607810c97d832b1d0b3f2766267b /internal/rpn/boolean_ops.go
parentead2412b0f0d23b2cfc3b265a3dae8841f8c84f7 (diff)
Refactor number.go to return errors instead of panicking
- Changed Number interface methods to return errors instead of panicking - Float64() now returns (float64, error) - Add, Sub, Mul, Pow, Compare, Bool() now return (Number, error) or (int, error) - StringNum and Symbol now return errors for unsupported operations - Added IsString() and IsSymbol() to Number interface - Removed unused arithmetic.go file - Updated operations.go, boolean_ops.go, hyper.go to handle errors - Added constants registry (internal/rpn/constants.go) with built-in math constants - Added constants_test.go with comprehensive unit tests - Updated README.md with constants documentation
Diffstat (limited to 'internal/rpn/boolean_ops.go')
-rw-r--r--internal/rpn/boolean_ops.go66
1 files changed, 60 insertions, 6 deletions
diff --git a/internal/rpn/boolean_ops.go b/internal/rpn/boolean_ops.go
index d07aa26..21501a9 100644
--- a/internal/rpn/boolean_ops.go
+++ b/internal/rpn/boolean_ops.go
@@ -28,7 +28,16 @@ func (o *BooleanOperations) GT(stack *Stack) error {
return fmt.Errorf("insufficient operands for gt: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() > b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal > bVal))
return nil
}
@@ -44,7 +53,16 @@ func (o *BooleanOperations) LT(stack *Stack) error {
return fmt.Errorf("insufficient operands for lt: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() < b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal < bVal))
return nil
}
@@ -60,7 +78,16 @@ func (o *BooleanOperations) GTE(stack *Stack) error {
return fmt.Errorf("insufficient operands for gte: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() >= b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal >= bVal))
return nil
}
@@ -76,7 +103,16 @@ func (o *BooleanOperations) LTE(stack *Stack) error {
return fmt.Errorf("insufficient operands for lte: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() <= b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal <= bVal))
return nil
}
@@ -92,7 +128,16 @@ func (o *BooleanOperations) EQ(stack *Stack) error {
return fmt.Errorf("insufficient operands for eq: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() == b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal == bVal))
return nil
}
@@ -108,6 +153,15 @@ func (o *BooleanOperations) NEQ(stack *Stack) error {
return fmt.Errorf("insufficient operands for neq: %w", err)
}
- stack.Push(NewFloatFromBool(a.Float64() != b.Float64()))
+ aVal, err := a.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for a: %w", err)
+ }
+ bVal, err := b.Float64()
+ if err != nil {
+ return fmt.Errorf("failed to get float64 value for b: %w", err)
+ }
+
+ stack.Push(NewFloatFromBool(aVal != bVal))
return nil
}