Skip to content

Commit

Permalink
Merge pull request #80 from project-eutopia/let_for_local_variables_i…
Browse files Browse the repository at this point in the history
…n_children

`let` makes variables local to current context
  • Loading branch information
project-eutopia committed Feb 22, 2018
2 parents b5b6477 + d2faa91 commit 627f4c1
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/keisan/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def variable_is_modifiable?(name)

def register_variable!(name, value, local: false)
if !@variable_registry.shadowed.member?(name) && (transient? || !local && @parent&.variable_is_modifiable?(name))
@parent.register_variable!(name, value)
@parent.register_variable!(name, value, local: local)
else
@variable_registry.register!(name, value)
end
Expand All @@ -93,7 +93,7 @@ def function_is_modifiable?(name)

def register_function!(name, function, local: false)
if transient? || !local && @parent&.function_is_modifiable?(name)
@parent.register_function!(name, function)
@parent.register_function!(name, function, local: local)
else
@function_registry.register!(name.to_s, function)
end
Expand Down
25 changes: 25 additions & 0 deletions spec/keisan/let_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

expect(calculator.evaluate("{let x = 11; x*2}")).to eq 22
expect(calculator.evaluate("x")).to eq 7
expect(calculator.evaluate("{x = 15; x}")).to eq 15
expect(calculator.evaluate("x")).to eq 15
end

it "raises error for single argument when not assignment" do
Expand All @@ -29,4 +31,27 @@
expect(calculator.evaluate("x").value).to eq 3
expect(calculator.evaluate("y").value).to eq 6
end

it "will create local definitions in children contexts" do
calculator2 = Keisan::Calculator.new(context: calculator.context.spawn_child)

calculator.evaluate("x = 10")
calculator.evaluate("f(x) = x**2")

calculator2.evaluate("x = 20")
calculator2.evaluate("f(x) = x**3")

expect(calculator.evaluate("x")).to eq 20
expect(calculator.evaluate("f(2)")).to eq 8
expect(calculator2.evaluate("x")).to eq 20
expect(calculator2.evaluate("f(2)")).to eq 8

calculator2.evaluate("let x = 30")
calculator2.evaluate("let f(x) = x**4")

expect(calculator.evaluate("x")).to eq 20
expect(calculator.evaluate("f(2)")).to eq 8
expect(calculator2.evaluate("x")).to eq 30
expect(calculator2.evaluate("f(2)")).to eq 16
end
end

0 comments on commit 627f4c1

Please sign in to comment.