kalc 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,16 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kalc (0.9.1)
5
- parslet (~> 1.5)
4
+ kalc (1.0.0)
5
+ parslet (~> 1.6)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- blankslate (2.1.2.4)
10
+ blankslate (3.1.3)
11
11
  diff-lcs (1.2.5)
12
- parslet (1.5.0)
13
- blankslate (~> 2.0)
12
+ parslet (1.6.2)
13
+ blankslate (>= 2.0, <= 4.0)
14
14
  rake (10.1.1)
15
15
  rspec (2.14.1)
16
16
  rspec-core (~> 2.14.0)
data/README.md CHANGED
@@ -20,10 +20,10 @@ functionality.
20
20
  Numbers
21
21
  -------
22
22
 
23
- All numbers are floating point.
23
+ All numbers are BigDecimal ruby class numbers for precision.
24
24
 
25
- 1 => 1.0
26
- 2.020 => 2.02
25
+ 1 => 1.0
26
+ 2.020 => 2.02
27
27
  1.23E => 12300000000.0
28
28
 
29
29
  Arithmetic
@@ -37,7 +37,7 @@ Arithmetic is standard infix with nesting via parenthesis.
37
37
  Logical operations
38
38
  ------------------
39
39
 
40
- 2 < 1 ? 1 : 3 # Ternary
40
+ 2 < 1 ? 1 : 3 # Ternary
41
41
  (1 || 2) # 1.0
42
42
  2 or 3 # 2.0
43
43
  OR(1 > 2, 3 < 2, 8 == 8) # true
@@ -47,7 +47,7 @@ Variable assignment
47
47
 
48
48
  The assignment operator `:=` is borrowed from Pascal. This decision was
49
49
  made for practical reason. Since comparison operators are both `=` and
50
- `==` and the language is expression-based, `=` could not be chosen.
50
+ `==` and the language is expression-based, `=` could not be chosen.
51
51
 
52
52
  Variables come in a lot of different flavors.
53
53
 
@@ -98,7 +98,7 @@ Some of them are:
98
98
  # Random number generation
99
99
  RAND
100
100
 
101
- # System level integration
101
+ # System level integration
102
102
  SYSTEM
103
103
 
104
104
  # Boolean functions
@@ -120,7 +120,7 @@ Some of them are:
120
120
  REGEXP_MATCH, REGEXP_REPLACE
121
121
 
122
122
  # Debugging
123
- P, PP, PUTS,
123
+ P, PP, PUTS,
124
124
 
125
125
  # Other
126
126
  PLUS_ONE, MINUS_ONE, SQUARE, CUBE, FIB, FACTORIAL,
@@ -129,12 +129,12 @@ Some of them are:
129
129
  Loops
130
130
  -----
131
131
 
132
- There are no looping mechanisms to speak of, but recursion works (pretty) well.
132
+ There are no looping mechanisms to speak of, but recursion works (pretty) well.
133
133
  **Note:** *go too deep and you might blow the stack!*
134
134
 
135
- DEFINE SAMPLE_LOOP(a) {
136
- PUTS(a)
137
- IF(a == 1, 1, SAMPLE_LOOP(a - 1))
135
+ DEFINE SAMPLE_LOOP(a) {
136
+ PUTS(a)
137
+ IF(a == 1, 1, SAMPLE_LOOP(a - 1))
138
138
  }
139
139
 
140
140
  There are a few examples of loops via recursion in `lib/stdlib.kalc`
data/kalc.gemspec CHANGED
@@ -21,5 +21,5 @@ Gem::Specification.new do |s|
21
21
  # specify any dependencies here; for example:
22
22
  s.add_development_dependency 'rake'
23
23
  s.add_development_dependency 'rspec'
24
- s.add_runtime_dependency 'parslet', '~> 1.5'
24
+ s.add_runtime_dependency 'parslet', '~> 1.6'
25
25
  end
data/lib/kalc.rb CHANGED
@@ -8,6 +8,7 @@ require 'kalc/transform'
8
8
  require 'kalc/environment'
9
9
  require 'kalc/interpreter'
10
10
  require 'kalc/repl'
11
+ require 'bigdecimal'
11
12
 
12
13
  module Kalc
13
14
  class Runner
data/lib/kalc/ast.rb CHANGED
@@ -77,15 +77,15 @@ module Kalc
77
77
  end
78
78
  end
79
79
 
80
- class FloatingPointNumber
80
+ class BigDecimalNumber
81
81
  attr_reader :value
82
82
 
83
83
  def initialize(value)
84
- @value = value
84
+ @value = BigDecimal.new(value.to_s)
85
85
  end
86
86
 
87
87
  def eval(context)
88
- Float(@value)
88
+ BigDecimal.new(@value)
89
89
  end
90
90
  end
91
91
 
@@ -139,7 +139,7 @@ module Kalc
139
139
  })
140
140
 
141
141
  env.add_function(:DOLLAR, lambda { |cxt, val, decimal_places|
142
- "%.#{Integer(decimal_places.eval(cxt))}f" % Float(val.eval(cxt))
142
+ "%.#{Integer(decimal_places.eval(cxt))}f" % BigDecimal.new(val.eval(cxt))
143
143
  })
144
144
 
145
145
  env.add_function(:EXACT, lambda { |cxt, string1, string2|
@@ -152,7 +152,7 @@ module Kalc
152
152
  })
153
153
 
154
154
  env.add_function(:FIXED, lambda { |cxt, val, decimal_places, no_commas|
155
- output = "%.#{Integer(decimal_places.eval(cxt))}f" % Float(val.eval(cxt))
155
+ output = "%.#{Integer(decimal_places.eval(cxt))}f" % BigDecimal.new(val.eval(cxt))
156
156
  output = output.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse if !no_commas.eval(cxt)
157
157
  output
158
158
  })
@@ -54,7 +54,7 @@ module Kalc
54
54
  }
55
55
 
56
56
  rule(:number => simple(:number)) {
57
- Ast::FloatingPointNumber.new(number)
57
+ Ast::BigDecimalNumber.new(number)
58
58
  }
59
59
 
60
60
  rule(:non_ops => subtree(:non_ops)) {
data/lib/kalc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kalc
2
- VERSION = '0.9.1'
2
+ VERSION = '1.0.0'
3
3
  end
data/spec/grammar_spec.rb CHANGED
@@ -9,7 +9,7 @@ describe Kalc::Grammar do
9
9
  end
10
10
  end
11
11
 
12
- context 'floats' do
12
+ context 'decimal numbers' do
13
13
  1.upto(10) do |i|
14
14
  1.upto(10) do |n|
15
15
  it { grammar.should parse("#{i}.#{n}") }
@@ -27,7 +27,7 @@ describe Kalc::Grammar do
27
27
  end
28
28
  end
29
29
 
30
- context 'basic float math' do
30
+ context 'basic decimal math' do
31
31
  1.upto(10) do |i|
32
32
  1.upto(10) do |n|
33
33
  it { grammar.should parse("#{i}.#{n} - #{i}.#{n}") }
@@ -69,11 +69,12 @@ describe Kalc::Interpreter do
69
69
  it { evaluate('FALSE && TRUE').should == false }
70
70
  end
71
71
 
72
- context 'Floating point number' do
72
+ context 'Decimal numbers' do
73
73
  it { evaluate('1.01').should == 1.01 }
74
74
  it { evaluate('1.01 + 0.02').should == 1.03 }
75
75
  it { evaluate('1.01 - 0.01').should == 1 }
76
76
  it { evaluate('1.1 + 1.1').should == 2.2 }
77
+ it { evaluate('1.2 - 1.0').should == 0.2 }
77
78
  it { evaluate('1.01 = 1.01').should == true }
78
79
  it { evaluate('1.01 = 1.02').should == false }
79
80
  end
metadata CHANGED
@@ -1,57 +1,64 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kalc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Chris Parker
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-01-31 00:00:00.000000000 Z
12
+ date: 2014-12-12 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rake
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - ">="
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - ">="
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rspec
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - ">="
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: '0'
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - ">="
43
+ - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: '0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: parslet
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - "~>"
51
+ - - ~>
46
52
  - !ruby/object:Gem::Version
47
- version: '1.5'
53
+ version: '1.6'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - "~>"
59
+ - - ~>
53
60
  - !ruby/object:Gem::Version
54
- version: '1.5'
61
+ version: '1.6'
55
62
  description: Calculation language slightly based on Excel's formula language.
56
63
  email:
57
64
  - mrcsparker@gmail.com
@@ -86,26 +93,27 @@ files:
86
93
  - spec/stdlib_spec.rb
87
94
  homepage: https://github.com/mrcsparker/kalc
88
95
  licenses: []
89
- metadata: {}
90
96
  post_install_message:
91
97
  rdoc_options: []
92
98
  require_paths:
93
99
  - lib
94
100
  required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
95
102
  requirements:
96
- - - ">="
103
+ - - ! '>='
97
104
  - !ruby/object:Gem::Version
98
105
  version: '0'
99
106
  required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
100
108
  requirements:
101
- - - ">="
109
+ - - ! '>='
102
110
  - !ruby/object:Gem::Version
103
111
  version: '0'
104
112
  requirements: []
105
113
  rubyforge_project: kalc
106
- rubygems_version: 2.2.0
114
+ rubygems_version: 1.8.23.2
107
115
  signing_key:
108
- specification_version: 4
116
+ specification_version: 3
109
117
  summary: Small calculation language.
110
118
  test_files:
111
119
  - spec/grammar_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 78824d628e330b0cea023998c7d855eb7ea61059
4
- data.tar.gz: 12eceba2e9e1495b692b725902f859373fc6fd10
5
- SHA512:
6
- metadata.gz: 40aead2c8de8ea0094ff49bcc49fdd6655b44de4c12d4f5564685821b4e06061d4480947c1b0937a5f62c6304ccae47d7decd7d4ff1c3f632cb4c2af63b9ba93
7
- data.tar.gz: 2c61afc8a347df7dde81435165339ac0e56d221aa79fb2fd755a915b3d9c55582899248361b9ec9549e87b301bb2547053c1b37842d017112b31ed46f5bdbf65