Module: Postsvg::Visitors::PsVisitor::Arithmetic
- Included in:
- Postsvg::Visitors::PsVisitor
- Defined in:
- lib/postsvg/visitors/ps_visitor/arithmetic.rb
Overview
Arithmetic / math operator handlers. Each pops operands from
the RUNTIME stack (not the AST), computes the result, and
pushes it back. The AST operands are for parse-time stack
shape only; at runtime they may be Computed sentinels
(from chained ops) and must be ignored.
Instance Method Summary collapse
- #visit_abs(_op, _ctx) ⇒ Object
- #visit_add(_op, _ctx) ⇒ Object
- #visit_atan(_op, _ctx) ⇒ Object
- #visit_ceiling(_op, _ctx) ⇒ Object
- #visit_cos(_op, _ctx) ⇒ Object
- #visit_div(_op, _ctx) ⇒ Object
- #visit_exp(_op, _ctx) ⇒ Object
- #visit_floor(_op, _ctx) ⇒ Object
- #visit_idiv(_op, _ctx) ⇒ Object
- #visit_ln(_op, _ctx) ⇒ Object
- #visit_log(_op, _ctx) ⇒ Object
- #visit_mod(_op, _ctx) ⇒ Object
- #visit_mul(_op, _ctx) ⇒ Object
- #visit_neg(_op, _ctx) ⇒ Object
- #visit_round(_op, _ctx) ⇒ Object
- #visit_sin(_op, _ctx) ⇒ Object
- #visit_sqrt(_op, _ctx) ⇒ Object
- #visit_sub(_op, _ctx) ⇒ Object
- #visit_truncate(_op, _ctx) ⇒ Object
Instance Method Details
#visit_abs(_op, _ctx) ⇒ Object
58 59 60 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 58 def visit_abs(_op, _ctx) @stack << pop_runtime_number.abs end |
#visit_add(_op, _ctx) ⇒ Object
12 13 14 15 16 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 12 def visit_add(_op, _ctx) b = pop_runtime_number a = pop_runtime_number @stack << a + b end |
#visit_atan(_op, _ctx) ⇒ Object
85 86 87 88 89 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 85 def visit_atan(_op, _ctx) b = pop_runtime_number a = pop_runtime_number @stack << Math.atan2(a.to_f, b.to_f) * (180.0 / Math::PI) end |
#visit_ceiling(_op, _ctx) ⇒ Object
62 63 64 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 62 def visit_ceiling(_op, _ctx) @stack << pop_runtime_number.to_f.ceil end |
#visit_cos(_op, _ctx) ⇒ Object
91 92 93 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 91 def visit_cos(_op, _ctx) @stack << Math.cos(pop_runtime_number.to_f * Math::PI / 180.0) end |
#visit_div(_op, _ctx) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 30 def visit_div(_op, _ctx) divisor = pop_runtime_number a = pop_runtime_number raise RenderError, "division by zero" if divisor.zero? @stack << (a.to_f / divisor.to_f) end |
#visit_exp(_op, _ctx) ⇒ Object
107 108 109 110 111 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 107 def visit_exp(_op, _ctx) b = pop_runtime_number a = pop_runtime_number @stack << a.to_f**b.to_f end |
#visit_floor(_op, _ctx) ⇒ Object
66 67 68 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 66 def visit_floor(_op, _ctx) @stack << pop_runtime_number.to_f.floor end |
#visit_idiv(_op, _ctx) ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 38 def visit_idiv(_op, _ctx) divisor = pop_runtime_number.to_i a = pop_runtime_number.to_i raise RenderError, "division by zero" if divisor.zero? @stack << (a / divisor) end |
#visit_ln(_op, _ctx) ⇒ Object
99 100 101 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 99 def visit_ln(_op, _ctx) @stack << Math.log(pop_runtime_number.to_f) end |
#visit_log(_op, _ctx) ⇒ Object
103 104 105 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 103 def visit_log(_op, _ctx) @stack << Math.log10(pop_runtime_number.to_f) end |
#visit_mod(_op, _ctx) ⇒ Object
46 47 48 49 50 51 52 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 46 def visit_mod(_op, _ctx) divisor = pop_runtime_number.to_i a = pop_runtime_number.to_i raise RenderError, "modulo by zero" if divisor.zero? @stack << (a % divisor) end |
#visit_mul(_op, _ctx) ⇒ Object
24 25 26 27 28 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 24 def visit_mul(_op, _ctx) b = pop_runtime_number a = pop_runtime_number @stack << a * b end |
#visit_neg(_op, _ctx) ⇒ Object
54 55 56 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 54 def visit_neg(_op, _ctx) @stack << -pop_runtime_number end |
#visit_round(_op, _ctx) ⇒ Object
70 71 72 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 70 def visit_round(_op, _ctx) @stack << pop_runtime_number.to_f.round end |
#visit_sin(_op, _ctx) ⇒ Object
95 96 97 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 95 def visit_sin(_op, _ctx) @stack << Math.sin(pop_runtime_number.to_f * Math::PI / 180.0) end |
#visit_sqrt(_op, _ctx) ⇒ Object
78 79 80 81 82 83 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 78 def visit_sqrt(_op, _ctx) operand = pop_runtime_number raise RenderError, "sqrt of negative" if operand.negative? @stack << Math.sqrt(operand.to_f) end |
#visit_sub(_op, _ctx) ⇒ Object
18 19 20 21 22 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 18 def visit_sub(_op, _ctx) b = pop_runtime_number a = pop_runtime_number @stack << a - b end |
#visit_truncate(_op, _ctx) ⇒ Object
74 75 76 |
# File 'lib/postsvg/visitors/ps_visitor/arithmetic.rb', line 74 def visit_truncate(_op, _ctx) @stack << pop_runtime_number.to_f.truncate end |