keisan 0.5.0 → 0.6.0

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -1
  3. data/keisan.gemspec +1 -0
  4. data/lib/keisan.rb +30 -0
  5. data/lib/keisan/ast/assignment.rb +44 -17
  6. data/lib/keisan/ast/block.rb +60 -0
  7. data/lib/keisan/ast/boolean.rb +5 -5
  8. data/lib/keisan/ast/builder.rb +10 -207
  9. data/lib/keisan/ast/cell.rb +60 -0
  10. data/lib/keisan/ast/constant_literal.rb +9 -0
  11. data/lib/keisan/ast/exponent.rb +6 -6
  12. data/lib/keisan/ast/function.rb +12 -8
  13. data/lib/keisan/ast/indexing.rb +25 -15
  14. data/lib/keisan/ast/line_builder.rb +230 -0
  15. data/lib/keisan/ast/list.rb +28 -1
  16. data/lib/keisan/ast/literal.rb +0 -8
  17. data/lib/keisan/ast/logical_and.rb +1 -1
  18. data/lib/keisan/ast/logical_or.rb +1 -1
  19. data/lib/keisan/ast/multi_line.rb +28 -0
  20. data/lib/keisan/ast/node.rb +32 -24
  21. data/lib/keisan/ast/number.rb +31 -31
  22. data/lib/keisan/ast/operator.rb +12 -4
  23. data/lib/keisan/ast/parent.rb +4 -4
  24. data/lib/keisan/ast/plus.rb +10 -10
  25. data/lib/keisan/ast/string.rb +3 -3
  26. data/lib/keisan/ast/times.rb +8 -8
  27. data/lib/keisan/ast/unary_identity.rb +1 -1
  28. data/lib/keisan/ast/unary_inverse.rb +7 -7
  29. data/lib/keisan/ast/unary_minus.rb +5 -5
  30. data/lib/keisan/ast/unary_operator.rb +2 -2
  31. data/lib/keisan/ast/unary_plus.rb +2 -2
  32. data/lib/keisan/ast/variable.rb +26 -10
  33. data/lib/keisan/context.rb +5 -5
  34. data/lib/keisan/evaluator.rb +15 -8
  35. data/lib/keisan/function.rb +24 -6
  36. data/lib/keisan/functions/cbrt.rb +1 -1
  37. data/lib/keisan/functions/cos.rb +1 -1
  38. data/lib/keisan/functions/cosh.rb +1 -1
  39. data/lib/keisan/functions/cot.rb +1 -1
  40. data/lib/keisan/functions/coth.rb +1 -1
  41. data/lib/keisan/functions/csc.rb +1 -1
  42. data/lib/keisan/functions/csch.rb +1 -1
  43. data/lib/keisan/functions/default_registry.rb +53 -74
  44. data/lib/keisan/functions/diff.rb +18 -14
  45. data/lib/keisan/functions/erf.rb +15 -0
  46. data/lib/keisan/functions/exp.rb +1 -1
  47. data/lib/keisan/functions/expression_function.rb +15 -21
  48. data/lib/keisan/functions/filter.rb +13 -15
  49. data/lib/keisan/functions/if.rb +14 -20
  50. data/lib/keisan/functions/let.rb +36 -0
  51. data/lib/keisan/functions/map.rb +11 -13
  52. data/lib/keisan/functions/math_function.rb +2 -2
  53. data/lib/keisan/functions/proc_function.rb +10 -6
  54. data/lib/keisan/functions/rand.rb +2 -1
  55. data/lib/keisan/functions/range.rb +74 -0
  56. data/lib/keisan/functions/reduce.rb +12 -14
  57. data/lib/keisan/functions/registry.rb +7 -7
  58. data/lib/keisan/functions/replace.rb +8 -8
  59. data/lib/keisan/functions/sample.rb +2 -1
  60. data/lib/keisan/functions/sec.rb +1 -1
  61. data/lib/keisan/functions/sech.rb +1 -1
  62. data/lib/keisan/functions/sin.rb +1 -1
  63. data/lib/keisan/functions/sinh.rb +1 -1
  64. data/lib/keisan/functions/sqrt.rb +1 -1
  65. data/lib/keisan/functions/tan.rb +1 -1
  66. data/lib/keisan/functions/tanh.rb +1 -1
  67. data/lib/keisan/functions/while.rb +46 -0
  68. data/lib/keisan/parser.rb +121 -79
  69. data/lib/keisan/parsing/assignment.rb +1 -1
  70. data/lib/keisan/parsing/bitwise_and.rb +1 -1
  71. data/lib/keisan/parsing/bitwise_not.rb +1 -1
  72. data/lib/keisan/parsing/bitwise_not_not.rb +1 -1
  73. data/lib/keisan/parsing/bitwise_or.rb +1 -1
  74. data/lib/keisan/parsing/bitwise_xor.rb +1 -1
  75. data/lib/keisan/parsing/curly_group.rb +6 -0
  76. data/lib/keisan/parsing/divide.rb +1 -1
  77. data/lib/keisan/parsing/exponent.rb +1 -1
  78. data/lib/keisan/parsing/function.rb +1 -1
  79. data/lib/keisan/parsing/group.rb +1 -1
  80. data/lib/keisan/parsing/indexing.rb +1 -1
  81. data/lib/keisan/parsing/line_separator.rb +6 -0
  82. data/lib/keisan/parsing/logical_and.rb +1 -1
  83. data/lib/keisan/parsing/logical_equal.rb +1 -1
  84. data/lib/keisan/parsing/logical_greater_than.rb +1 -1
  85. data/lib/keisan/parsing/logical_greater_than_or_equal_to.rb +1 -1
  86. data/lib/keisan/parsing/logical_less_than.rb +1 -1
  87. data/lib/keisan/parsing/logical_less_than_or_equal_to.rb +1 -1
  88. data/lib/keisan/parsing/logical_not.rb +1 -1
  89. data/lib/keisan/parsing/logical_not_equal.rb +1 -1
  90. data/lib/keisan/parsing/logical_not_not.rb +1 -1
  91. data/lib/keisan/parsing/logical_or.rb +1 -1
  92. data/lib/keisan/parsing/minus.rb +1 -1
  93. data/lib/keisan/parsing/modulo.rb +1 -1
  94. data/lib/keisan/parsing/operator.rb +1 -1
  95. data/lib/keisan/parsing/plus.rb +1 -1
  96. data/lib/keisan/parsing/times.rb +1 -1
  97. data/lib/keisan/parsing/unary_minus.rb +1 -1
  98. data/lib/keisan/parsing/unary_operator.rb +1 -1
  99. data/lib/keisan/parsing/unary_plus.rb +1 -1
  100. data/lib/keisan/repl.rb +1 -1
  101. data/lib/keisan/tokenizer.rb +4 -9
  102. data/lib/keisan/tokens/group.rb +3 -1
  103. data/lib/keisan/tokens/line_separator.rb +11 -0
  104. data/lib/keisan/variables/default_registry.rb +0 -5
  105. data/lib/keisan/variables/registry.rb +7 -7
  106. data/lib/keisan/version.rb +1 -1
  107. metadata +27 -2
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Assignment < Operator
4
4
  def node_class
5
- Keisan::AST::Assignment
5
+ AST::Assignment
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class BitwiseAnd < BitwiseOperator
4
4
  def node_class
5
- Keisan::AST::BitwiseAnd
5
+ AST::BitwiseAnd
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class BitwiseNot < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryBitwiseNot
5
+ AST::UnaryBitwiseNot
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class BitwiseNotNot < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryIdentity
5
+ AST::UnaryIdentity
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class BitwiseOr < BitwiseOperator
4
4
  def node_class
5
- Keisan::AST::BitwiseOr
5
+ AST::BitwiseOr
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class BitwiseXor < BitwiseOperator
4
4
  def node_class
5
- Keisan::AST::BitwiseXor
5
+ AST::BitwiseXor
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,6 @@
1
+ module Keisan
2
+ module Parsing
3
+ class CurlyGroup < Group
4
+ end
5
+ end
6
+ end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Divide < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Times
5
+ AST::Times
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Exponent < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Exponent
5
+ AST::Exponent
6
6
  end
7
7
  end
8
8
  end
@@ -5,7 +5,7 @@ module Keisan
5
5
 
6
6
  def initialize(name, arguments)
7
7
  @name = name
8
- @arguments = arguments
8
+ @arguments = Array.wrap(arguments)
9
9
  end
10
10
  end
11
11
  end
@@ -4,7 +4,7 @@ module Keisan
4
4
  attr_reader :components
5
5
 
6
6
  def initialize(sub_tokens)
7
- @components = Keisan::Parser.new(tokens: sub_tokens).components
7
+ @components = Parser.new(tokens: sub_tokens).components
8
8
  end
9
9
  end
10
10
  end
@@ -7,7 +7,7 @@ module Keisan
7
7
  end
8
8
 
9
9
  def node_class
10
- Keisan::AST::Indexing
10
+ AST::Indexing
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,6 @@
1
+ module Keisan
2
+ module Parsing
3
+ class LineSeparator < Component
4
+ end
5
+ end
6
+ end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalAnd < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalAnd
5
+ AST::LogicalAnd
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalEqual < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalEqual
5
+ AST::LogicalEqual
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalGreaterThan < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalGreaterThan
5
+ AST::LogicalGreaterThan
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalGreaterThanOrEqualTo < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalGreaterThanOrEqualTo
5
+ AST::LogicalGreaterThanOrEqualTo
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalLessThan < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalLessThan
5
+ AST::LogicalLessThan
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalLessThanOrEqualTo < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalLessThanOrEqualTo
5
+ AST::LogicalLessThanOrEqualTo
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalNot < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryLogicalNot
5
+ AST::UnaryLogicalNot
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalNotEqual < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalNotEqual
5
+ AST::LogicalNotEqual
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalNotNot < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryIdentity
5
+ AST::UnaryIdentity
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class LogicalOr < LogicalOperator
4
4
  def node_class
5
- Keisan::AST::LogicalOr
5
+ AST::LogicalOr
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Minus < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Plus
5
+ AST::Plus
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Modulo < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Modulo
5
+ AST::Modulo
6
6
  end
7
7
  end
8
8
  end
@@ -14,7 +14,7 @@ module Keisan
14
14
  end
15
15
 
16
16
  def node_class
17
- raise Keisan::Exceptions::NotImplementedError.new
17
+ raise Exceptions::NotImplementedError.new
18
18
  end
19
19
  end
20
20
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Plus < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Plus
5
+ AST::Plus
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class Times < ArithmeticOperator
4
4
  def node_class
5
- Keisan::AST::Times
5
+ AST::Times
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class UnaryMinus < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryMinus
5
+ AST::UnaryMinus
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class UnaryOperator < Operator
4
4
  def node_class
5
- raise Keisan::Exponent::NotImplementedError.new
5
+ raise Exponent::NotImplementedError.new
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Keisan
2
2
  module Parsing
3
3
  class UnaryPlus < UnaryOperator
4
4
  def node_class
5
- Keisan::AST::UnaryPlus
5
+ AST::UnaryPlus
6
6
  end
7
7
  end
8
8
  end
@@ -20,7 +20,7 @@ module Keisan
20
20
  end
21
21
 
22
22
  def reset
23
- @calculator = Keisan::Calculator.new
23
+ @calculator = Calculator.new
24
24
  end
25
25
 
26
26
  def start
@@ -12,7 +12,8 @@ module Keisan
12
12
  Tokens::BitwiseOperator,
13
13
  Tokens::Assignment,
14
14
  Tokens::Comma,
15
- Tokens::Dot
15
+ Tokens::Dot,
16
+ Tokens::LineSeparator
16
17
  ]
17
18
 
18
19
  TOKEN_REGEX = Regexp::new(
@@ -30,13 +31,11 @@ module Keisan
30
31
  def self.strip_whitespace_and_comments(expression)
31
32
  # Remove comments
32
33
  expression = expression.split("#").first || ""
33
-
34
- # Do not allow whitespace between variables, numbers, and the like; they must be joined by operators
35
- raise Keisan::Exceptions::TokenizingError.new if expression.gsub(Tokens::String.regex, "").match /\w\s+\w/
34
+ expression = expression.gsub(/\n/, ";")
36
35
 
37
36
  # Only strip whitespace outside of strings, e.g.
38
37
  # "1 + 2 + 'hello world'" => "1+2+'hello world'"
39
- expression.split(Keisan::Tokens::String.regex).map.with_index {|s,i| i.even? ? s.gsub(/\s+/, "") : s}.join
38
+ expression.split(Tokens::String.regex).map.with_index {|s,i| i.even? ? s.gsub(/\s+/, " ") : s}.join
40
39
  end
41
40
 
42
41
  private
@@ -51,10 +50,6 @@ module Keisan
51
50
  token_class = TOKEN_CLASSES[i].new(token_string)
52
51
  end
53
52
 
54
- unless tokenizing_check == @expression
55
- raise Keisan::Exceptions::TokenizingError.new("Expected \"#{@expression}\", tokenized \"#{tokenizing_check}\"")
56
- end
57
-
58
53
  tokens
59
54
  end
60
55
  end
@@ -1,7 +1,7 @@
1
1
  module Keisan
2
2
  module Tokens
3
3
  class Group < Token
4
- REGEX = /(\((?:[^\[\]\(\)]*\g<1>*)*\)|\[(?:[^\[\]\(\)]*\g<1>*)*\])/
4
+ REGEX = /(\((?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\)|\[(?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\]|\{(?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\})/
5
5
 
6
6
  attr_reader :sub_tokens
7
7
 
@@ -21,6 +21,8 @@ module Keisan
21
21
  :round
22
22
  when "["
23
23
  :square
24
+ when "{"
25
+ :curly
24
26
  end
25
27
  end
26
28
  end
@@ -0,0 +1,11 @@
1
+ module Keisan
2
+ module Tokens
3
+ class LineSeparator < Token
4
+ REGEX = /([;\n]+)/
5
+
6
+ def self.regex
7
+ REGEX
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,6 @@
1
1
  module Keisan
2
2
  module Variables
3
3
  class DefaultRegistry < Registry
4
- def initialize
5
- @hash = {}
6
- @parent = self.class.registry
7
- end
8
-
9
4
  VARIABLES = {
10
5
  "PI" => Math::PI,
11
6
  "E" => Math::E,
@@ -16,14 +16,14 @@ module Keisan
16
16
 
17
17
  def [](name)
18
18
  return @hash[name] if @hash.has_key?(name)
19
- raise Keisan::Exceptions::UndefinedVariableError.new if @shadowed.include?(name)
19
+ raise Exceptions::UndefinedVariableError.new if @shadowed.include?(name)
20
20
 
21
21
  if @parent && (parent_value = @parent[name])
22
22
  return parent_value
23
23
  end
24
24
 
25
25
  return default_registry[name] if @use_defaults && default_registry.has_name?(name)
26
- raise Keisan::Exceptions::UndefinedVariableError.new name
26
+ raise Exceptions::UndefinedVariableError.new name
27
27
  end
28
28
 
29
29
  def locals
@@ -32,19 +32,19 @@ module Keisan
32
32
 
33
33
  def has?(name)
34
34
  !self[name].nil?
35
- rescue Keisan::Exceptions::UndefinedVariableError
35
+ rescue Exceptions::UndefinedVariableError
36
36
  false
37
37
  end
38
38
 
39
39
  def register!(name, value, force: false)
40
40
  name = name.to_s
41
- name = name.name if name.is_a?(Keisan::AST::Variable)
41
+ name = name.name if name.is_a?(AST::Variable)
42
42
 
43
- raise Keisan::Exceptions::UnmodifiableError.new("Cannot modify frozen variables registry") if frozen?
43
+ raise Exceptions::UnmodifiableError.new("Cannot modify frozen variables registry") if frozen?
44
44
  if !force && @use_defaults && default_registry.has_name?(name)
45
- raise Keisan::Exceptions::UnmodifiableError.new("Cannot overwrite default variable")
45
+ raise Exceptions::UnmodifiableError.new("Cannot overwrite default variable")
46
46
  end
47
- self[name.to_s] = value.to_node
47
+ self[name.to_s] = AST::Cell.new(value.to_node)
48
48
  end
49
49
 
50
50
  protected
@@ -1,3 +1,3 @@
1
1
  module Keisan
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keisan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Locke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-14 00:00:00.000000000 Z
11
+ date: 2017-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 4.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: coveralls
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -120,12 +134,15 @@ files:
120
134
  - lib/keisan/ast/bitwise_operator.rb
121
135
  - lib/keisan/ast/bitwise_or.rb
122
136
  - lib/keisan/ast/bitwise_xor.rb
137
+ - lib/keisan/ast/block.rb
123
138
  - lib/keisan/ast/boolean.rb
124
139
  - lib/keisan/ast/builder.rb
140
+ - lib/keisan/ast/cell.rb
125
141
  - lib/keisan/ast/constant_literal.rb
126
142
  - lib/keisan/ast/exponent.rb
127
143
  - lib/keisan/ast/function.rb
128
144
  - lib/keisan/ast/indexing.rb
145
+ - lib/keisan/ast/line_builder.rb
129
146
  - lib/keisan/ast/list.rb
130
147
  - lib/keisan/ast/literal.rb
131
148
  - lib/keisan/ast/logical_and.rb
@@ -138,6 +155,7 @@ files:
138
155
  - lib/keisan/ast/logical_operator.rb
139
156
  - lib/keisan/ast/logical_or.rb
140
157
  - lib/keisan/ast/modulo.rb
158
+ - lib/keisan/ast/multi_line.rb
141
159
  - lib/keisan/ast/node.rb
142
160
  - lib/keisan/ast/null.rb
143
161
  - lib/keisan/ast/number.rb
@@ -170,16 +188,19 @@ files:
170
188
  - lib/keisan/functions/csch.rb
171
189
  - lib/keisan/functions/default_registry.rb
172
190
  - lib/keisan/functions/diff.rb
191
+ - lib/keisan/functions/erf.rb
173
192
  - lib/keisan/functions/exp.rb
174
193
  - lib/keisan/functions/expression_function.rb
175
194
  - lib/keisan/functions/filter.rb
176
195
  - lib/keisan/functions/if.rb
177
196
  - lib/keisan/functions/imag.rb
197
+ - lib/keisan/functions/let.rb
178
198
  - lib/keisan/functions/log.rb
179
199
  - lib/keisan/functions/map.rb
180
200
  - lib/keisan/functions/math_function.rb
181
201
  - lib/keisan/functions/proc_function.rb
182
202
  - lib/keisan/functions/rand.rb
203
+ - lib/keisan/functions/range.rb
183
204
  - lib/keisan/functions/real.rb
184
205
  - lib/keisan/functions/reduce.rb
185
206
  - lib/keisan/functions/registry.rb
@@ -192,6 +213,7 @@ files:
192
213
  - lib/keisan/functions/sqrt.rb
193
214
  - lib/keisan/functions/tan.rb
194
215
  - lib/keisan/functions/tanh.rb
216
+ - lib/keisan/functions/while.rb
195
217
  - lib/keisan/parser.rb
196
218
  - lib/keisan/parsing/argument.rb
197
219
  - lib/keisan/parsing/arithmetic_operator.rb
@@ -204,6 +226,7 @@ files:
204
226
  - lib/keisan/parsing/bitwise_xor.rb
205
227
  - lib/keisan/parsing/boolean.rb
206
228
  - lib/keisan/parsing/component.rb
229
+ - lib/keisan/parsing/curly_group.rb
207
230
  - lib/keisan/parsing/divide.rb
208
231
  - lib/keisan/parsing/dot.rb
209
232
  - lib/keisan/parsing/dot_operator.rb
@@ -213,6 +236,7 @@ files:
213
236
  - lib/keisan/parsing/function.rb
214
237
  - lib/keisan/parsing/group.rb
215
238
  - lib/keisan/parsing/indexing.rb
239
+ - lib/keisan/parsing/line_separator.rb
216
240
  - lib/keisan/parsing/list.rb
217
241
  - lib/keisan/parsing/logical_and.rb
218
242
  - lib/keisan/parsing/logical_equal.rb
@@ -249,6 +273,7 @@ files:
249
273
  - lib/keisan/tokens/comma.rb
250
274
  - lib/keisan/tokens/dot.rb
251
275
  - lib/keisan/tokens/group.rb
276
+ - lib/keisan/tokens/line_separator.rb
252
277
  - lib/keisan/tokens/logical_operator.rb
253
278
  - lib/keisan/tokens/null.rb
254
279
  - lib/keisan/tokens/number.rb