Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 8 additions & 14 deletions ports-rb/scheme.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,6 @@ def find(key)
raise "Lookup error for #{key}"
end
end

def unset(key)
if @env.key?(key)
@env.delete(key)
else
raise "Cannot unset non-existent variable #{key}"
end
end
end

class Procedure
Expand Down Expand Up @@ -131,12 +123,6 @@ def expand(x, toplevel = false)
var = x[1]
require_syntax(x, var.is_a?(Symbol), "can set! only a symbol")
[:set!, var, expand(x[2])]
when :unset
# (variable-unset! var)
require_syntax(x, x.length == 2)
var = x[1]
require_syntax(x, var.is_a?(Symbol), "can unset! only a symbol")
[:"variable-unset!", var]
when :define, :"define-macro"
# Check correct length
require_syntax(x, x.length >= 3)
Expand Down Expand Up @@ -316,6 +302,14 @@ def evaluate(tokens, environment = GLOBAL_ENV)
environment.find(var)[var] = evaluate(expression, environment)
return

when :cond
branch = tokens[1..].find do |(test, expression)|
test == :else || evaluate(test, environment)
end
return if branch.nil?

tokens = branch[1]

else
expressions = tokens.map { |t| evaluate(t, environment) }
procedure = expressions.shift
Expand Down
6 changes: 6 additions & 0 deletions ports-rb/semantic-tests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ def matches(result, target)
require_relative "scheme"

# Run tests

total = test_table.length
failed = 0

test_table.each do |entry|
input = entry["input"]

Expand All @@ -61,5 +65,7 @@ def matches(result, target)
puts "✅: #{input}"
else
puts "❌: #{input} got #{eval_result}[#{eval_result.class}] instead of #{entry["expected"]}[#{entry["expected"].class}]"
failed += 1
end
end
puts "#{total} tests run, #{failed} failed"
3 changes: 3 additions & 0 deletions ports/lispy-tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
{"input": "(+ (* 2 100) (* 1 10))", "expected": 210},
{"input": "(if (> 6 5) (+ 1 1) (+ 2 2))", "expected": 2},
{"input": "(if (< 6 5) (+ 1 1) (+ 2 2))", "expected": 4},
{"input": "(cond ((< 6 5) 1) ((< 5 6) 2) (else 3) )", "expected": 2},
{"input": "(cond ((< 6 5) 1) (#f 2) (else 3) )", "expected": 3},
{"input": "(cond ((< 6 5) 1) (#f 2))", "expected": null},
{"input": "(define x 3)", "expected": null},
{"input": "x", "expected": 3},
{"input": "(+ x x)", "expected": 6},
Expand Down