maths 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -56,6 +56,16 @@ maths> x = y = z = 25
56
56
  = 25
57
57
  ```
58
58
 
59
+ There's even a special variable, `$`, that is always set to the result of
60
+ the last calculation:
61
+
62
+ ```
63
+ maths> 5 + 5
64
+ = 10
65
+ maths> $
66
+ = 10
67
+ ```
68
+
59
69
  And of course, sometimes you'll want to close the app:
60
70
 
61
71
  ```
@@ -88,6 +98,20 @@ maths> 2 ^ 4
88
98
  = 16
89
99
  ```
90
100
 
101
+ Percentages!
102
+ ```
103
+ maths> 2 as a % of 4
104
+ = 50%
105
+ ```
106
+
107
+ Maths also includes some constants:
108
+
109
+ Pi!
110
+ ```
111
+ maths> pi
112
+ = 3.14159265358979323846264338327
113
+ ```
114
+
91
115
  Maths is still pretty new - I hacked the original version together on a flight, and it's still maturing. If you'd like to see something added, let me know in the [issue tracker](https://github.com/commondream/maths/issues).
92
116
 
93
117
  ## Contributing
data/bin/maths CHANGED
@@ -16,7 +16,6 @@ Readline.completion_proc = Proc.new do |str|
16
16
  # TODO: Get this working
17
17
  end
18
18
 
19
-
20
19
  prompt = "maths> "
21
20
  while command = Readline.readline(prompt, true)
22
21
  break if /exit/i =~ command
@@ -33,6 +32,7 @@ while command = Readline.readline(prompt, true)
33
32
  result = parser.parse(command)
34
33
 
35
34
  puts "= #{Maths::Formatter.format(result)}"
35
+ Maths::Brain.assign("$", result)
36
36
  rescue ParseError
37
37
  puts $!
38
38
  end
data/lib/maths/calc.y CHANGED
@@ -24,7 +24,6 @@ rule
24
24
  | '-' NUMBER =UMINUS { result = -val[1] }
25
25
  | VARIABLE { result = Brain.lookup(val[0])}
26
26
  | NUMBER
27
- | FLOAT
28
27
  | FUNC exp { result = Maths::Functions.exec(val[0], val[1]) }
29
28
  | exp PERCENTAGE_OF exp { result = Percentage.build(val[0], val[2]) }
30
29
 
@@ -42,7 +41,11 @@ module Maths
42
41
  @q = []
43
42
  until str.empty?
44
43
  case str
44
+
45
+ # ignore whitespace
45
46
  when /\A\s+/
47
+
48
+ # percentage handling
46
49
  when /\Aas a percentage of/
47
50
  @q.push [:PERCENTAGE_OF, $&]
48
51
  when /\Aas a % of/
@@ -52,16 +55,25 @@ module Maths
52
55
  when /\Aas % of/
53
56
  @q.push [:PERCENTAGE_OF, $&]
54
57
 
58
+ # special terms
59
+ when /\Api/
60
+ @q.push [:NUMBER, BigDecimal.new("3.14159265358979323846264338327")]
61
+
62
+ # variables and functions
55
63
  when /\A[A-Za-z]+[0-9]*/
56
64
  if Maths::Functions::FUNCTIONS.has_key?($&)
57
65
  @q.push [:FUNC, $&]
58
66
  else
59
67
  @q.push [:VARIABLE, $&]
60
68
  end
61
- when /\A\d+\.\d+/
62
- @q.push [:FLOAT, BigDecimal.new($&)]
63
- when /\A\d+/
69
+ when /\A\$/
70
+ @q.push [:VARIABLE, $&]
71
+
72
+ # numbers
73
+ when /\A\d+(\.\d+)?([Ee]\d+)?/
64
74
  @q.push [:NUMBER, BigDecimal.new($&)]
75
+ # when /\A\d+/
76
+ # @q.push [:NUMBER, BigDecimal.new($&)]
65
77
  when /\A.|\n/o
66
78
  s = $&
67
79
  @q.push [s, s]
@@ -1,7 +1,27 @@
1
1
  module Maths
2
2
  class Functions
3
3
  FUNCTIONS = {
4
- "sqrt" => Proc.new { |val| BigDecimal.new(Math.sqrt(val).to_s) }
4
+ "sqrt" => Proc.new { |val| BigDecimal.new(Math.sqrt(val).to_s) },
5
+ "cbrt" => Proc.new { |val| BigDecimal.new(Math.cbrt(val).to_s) },
6
+ "sin" => Proc.new { |val| BigDecimal.new(Math.sin(val).to_s) },
7
+ "asin" => Proc.new { |val| BigDecimal.new(Math.sin(val).to_s) },
8
+ "sinh" => Proc.new { |val| BigDecimal.new(Math.sinh(val).to_s) },
9
+ "asinh" => Proc.new { |val| BigDecimal.new(Math.asinh(val).to_s) },
10
+ "cos" => Proc.new { |val| BigDecimal.new(Math.cos(val).to_s) },
11
+ "acos" => Proc.new { |val| BigDecimal.new(Math.acos(val).to_s) },
12
+ "cosh" => Proc.new { |val| BigDecimal.new(Math.cosh(val).to_s) },
13
+ "acosh" => Proc.new { |val| BigDecimal.new(Math.acosh(val).to_s) },
14
+ "tan" => Proc.new { |val| BigDecimal.new(Math.tan(val).to_s) },
15
+ "atan" => Proc.new { |val| BigDecimal.new(Math.atan(val).to_s) },
16
+ "tanh" => Proc.new { |val| BigDecimal.new(Math.tanh(val).to_s) },
17
+ "atanh" => Proc.new { |val| BigDecimal.new(Math.atanh(val).to_s) },
18
+ "ln" => Proc.new { |val| BigDecimal.new(Math.log(val).to_s) },
19
+ "log" => Proc.new { |val| BigDecimal.new(Math.log10(val).to_s) },
20
+ "log2" => Proc.new { |val| BigDecimal.new(Math.log2(val).to_s) },
21
+ "floor" => Proc.new { |val| BigDecimal.new(val.floor.to_s) },
22
+ "ceil" => Proc.new { |val| BigDecimal.new(val.ceil.to_s) },
23
+ "ceiling" => Proc.new { |val| BigDecimal.new(val.ceil.to_s) },
24
+ "round" => Proc.new { |val| BigDecimal.new(val.round.to_s) }
5
25
  }
6
26
 
7
27
  def self.exec(function, value)
data/lib/maths/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Maths
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maths
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: