keisan 0.9.1 → 0.9.2
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.
- checksums.yaml +4 -4
 - data/lib/keisan/ast/assignment.rb +23 -3
 - data/lib/keisan/ast/multi_line.rb +40 -0
 - data/lib/keisan/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e9daac57399adbc7f0028c078c8ec1a74e6a5b7222f2473a871d2ca7ae46c1e4
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2ffd26dec791b8a88e1edce5aeaf331622ccbb2403b5f17185d3aad36065c173
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 90b892b2b7602af3406bdbd84b18d211e790afcf185268f3d84800d8fe390d099870053e39f39d2c46e82da0ba7b185597c1d462af359a1fdb7a0f3aad07c80a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 29175b77265433e8e619a098e7e862472c7575bc2de91b38ed8e853355e3a133da5a33f6e43a321295cbff0a900e41502885c1fc4dbe649431fadc1baa767469
         
     | 
| 
         @@ -49,11 +49,13 @@ module Keisan 
     | 
|
| 
       49 
49 
     | 
    
         
             
                  end
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
51 
     | 
    
         
             
                  def unbound_variables(context = nil)
         
     | 
| 
       52 
     | 
    
         
            -
                     
     | 
| 
      
 52 
     | 
    
         
            +
                    context ||= Context.new
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       53 
54 
     | 
    
         
             
                    if is_variable_definition?
         
     | 
| 
       54 
     | 
    
         
            -
                       
     | 
| 
      
 55 
     | 
    
         
            +
                      variable_assignment_unbound_variables(context)
         
     | 
| 
       55 
56 
     | 
    
         
             
                    else
         
     | 
| 
       56 
     | 
    
         
            -
                       
     | 
| 
      
 57 
     | 
    
         
            +
                      # TODO: Should update to handle function / list assignment.
         
     | 
| 
      
 58 
     | 
    
         
            +
                      super(context)
         
     | 
| 
       57 
59 
     | 
    
         
             
                    end
         
     | 
| 
       58 
60 
     | 
    
         
             
                  end
         
     | 
| 
       59 
61 
     | 
    
         | 
| 
         @@ -70,6 +72,10 @@ module Keisan 
     | 
|
| 
       70 
72 
     | 
    
         
             
                    children.first.is_a?(Variable)
         
     | 
| 
       71 
73 
     | 
    
         
             
                  end
         
     | 
| 
       72 
74 
     | 
    
         | 
| 
      
 75 
     | 
    
         
            +
                  def variable_name
         
     | 
| 
      
 76 
     | 
    
         
            +
                    children.first.name
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
       73 
79 
     | 
    
         
             
                  def is_function_definition?
         
     | 
| 
       74 
80 
     | 
    
         
             
                    children.first.is_a?(Function)
         
     | 
| 
       75 
81 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -78,6 +84,10 @@ module Keisan 
     | 
|
| 
       78 
84 
     | 
    
         
             
                    children.first.is_a?(List)
         
     | 
| 
       79 
85 
     | 
    
         
             
                  end
         
     | 
| 
       80 
86 
     | 
    
         | 
| 
      
 87 
     | 
    
         
            +
                  def rhs_unbound_variables(context = nil)
         
     | 
| 
      
 88 
     | 
    
         
            +
                    children.last.unbound_variables(context)
         
     | 
| 
      
 89 
     | 
    
         
            +
                  end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
       81 
91 
     | 
    
         
             
                  private
         
     | 
| 
       82 
92 
     | 
    
         | 
| 
       83 
93 
     | 
    
         
             
                  def evaluate_variable_assignment(context, lhs, rhs)
         
     | 
| 
         @@ -96,6 +106,16 @@ module Keisan 
     | 
|
| 
       96 
106 
     | 
    
         
             
                  def evaluate_cell_assignment(context, lhs, rhs)
         
     | 
| 
       97 
107 
     | 
    
         
             
                    CellAssignment.new(self, context, lhs, rhs).evaluate
         
     | 
| 
       98 
108 
     | 
    
         
             
                  end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  def variable_assignment_unbound_variables(context)
         
     | 
| 
      
 111 
     | 
    
         
            +
                    rhs = rhs_unbound_variables(context)
         
     | 
| 
      
 112 
     | 
    
         
            +
                    # If the right-side is fully defined, then this is a valid assignment.
         
     | 
| 
      
 113 
     | 
    
         
            +
                    if rhs.empty?
         
     | 
| 
      
 114 
     | 
    
         
            +
                      Set.new
         
     | 
| 
      
 115 
     | 
    
         
            +
                    else
         
     | 
| 
      
 116 
     | 
    
         
            +
                      rhs | Set.new([variable_name])
         
     | 
| 
      
 117 
     | 
    
         
            +
                    end
         
     | 
| 
      
 118 
     | 
    
         
            +
                  end
         
     | 
| 
       99 
119 
     | 
    
         
             
                end
         
     | 
| 
       100 
120 
     | 
    
         
             
              end
         
     | 
| 
       101 
121 
     | 
    
         
             
            end
         
     | 
| 
         @@ -20,9 +20,49 @@ module Keisan 
     | 
|
| 
       20 
20 
     | 
    
         
             
                    evaluate(context)
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
      
 23 
     | 
    
         
            +
                  def unbound_variables(context = nil)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    context ||= Context.new
         
     | 
| 
      
 25 
     | 
    
         
            +
                    defined_variables = Set.new
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    children.inject(Set.new) do |unbound_vars, child|
         
     | 
| 
      
 28 
     | 
    
         
            +
                      if child.is_a?(Assignment) && child.is_variable_definition?
         
     | 
| 
      
 29 
     | 
    
         
            +
                        line_unbound_vars = unbound_variables_for_line_variable_assignment(context, child, unbound_vars, defined_variables)
         
     | 
| 
      
 30 
     | 
    
         
            +
                        if line_unbound_vars.empty?
         
     | 
| 
      
 31 
     | 
    
         
            +
                          defined_variables.add(child.variable_name)
         
     | 
| 
      
 32 
     | 
    
         
            +
                        end
         
     | 
| 
      
 33 
     | 
    
         
            +
                        unbound_vars | line_unbound_vars
         
     | 
| 
      
 34 
     | 
    
         
            +
                      else
         
     | 
| 
      
 35 
     | 
    
         
            +
                        unbound_vars | (child.unbound_variables(context) - defined_variables)
         
     | 
| 
      
 36 
     | 
    
         
            +
                      end
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
                  end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
       23 
40 
     | 
    
         
             
                  def to_s
         
     | 
| 
       24 
41 
     | 
    
         
             
                    children.map(&:to_s).join(";")
         
     | 
| 
       25 
42 
     | 
    
         
             
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                  private
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  def unbound_variables_for_line_variable_assignment(context, line, unbound_vars, defined_variables)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    child_unbound_variables = variable_assignment_unbound_variables(context, line, defined_variables)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    if child_unbound_variables.empty?
         
     | 
| 
      
 49 
     | 
    
         
            +
                      defined_variables.add(line.variable_name)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      unbound_vars
         
     | 
| 
      
 51 
     | 
    
         
            +
                    else
         
     | 
| 
      
 52 
     | 
    
         
            +
                      unbound_vars | child_unbound_variables
         
     | 
| 
      
 53 
     | 
    
         
            +
                    end
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  def variable_assignment_unbound_variables(context, assignment, defined_variables)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    rhs_child_unbound_variables = assignment.rhs_unbound_variables(context) - defined_variables
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    # If there are no unbound variables, this is a properly bound assignment.
         
     | 
| 
      
 60 
     | 
    
         
            +
                    if rhs_child_unbound_variables.empty?
         
     | 
| 
      
 61 
     | 
    
         
            +
                      Set.new
         
     | 
| 
      
 62 
     | 
    
         
            +
                    else
         
     | 
| 
      
 63 
     | 
    
         
            +
                      Set.new([assignment.variable_name]) | rhs_child_unbound_variables
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
       26 
66 
     | 
    
         
             
                end
         
     | 
| 
       27 
67 
     | 
    
         
             
              end
         
     | 
| 
       28 
68 
     | 
    
         
             
            end
         
     | 
    
        data/lib/keisan/version.rb
    CHANGED
    
    
    
        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.9. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.9.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Christopher Locke
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2024-03-04 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: cmath
         
     |