From 538f4cb1ba8ae6811eacc8fe9227334b6f939e67 Mon Sep 17 00:00:00 2001 From: Peter Retzlaff Date: Thu, 13 Mar 2025 09:16:58 +0100 Subject: [PATCH 1/3] Remove unused unset-method and branch variable-unset! is not required/used anymore --- ports-rb/scheme.rb | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/ports-rb/scheme.rb b/ports-rb/scheme.rb index 22803e0..3ad12f3 100644 --- a/ports-rb/scheme.rb +++ b/ports-rb/scheme.rb @@ -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 @@ -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) From fbf565e9a1aaa2ef0070053b16b95188948b32ff Mon Sep 17 00:00:00 2001 From: Peter Retzlaff Date: Thu, 13 Mar 2025 09:38:46 +0100 Subject: [PATCH 2/3] Implement `cond` in Ruby interpreter Also, add some test cases --- ports-rb/scheme.rb | 8 ++++++++ ports/lispy-tests.json | 3 +++ 2 files changed, 11 insertions(+) diff --git a/ports-rb/scheme.rb b/ports-rb/scheme.rb index 3ad12f3..7383c38 100644 --- a/ports-rb/scheme.rb +++ b/ports-rb/scheme.rb @@ -302,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 diff --git a/ports/lispy-tests.json b/ports/lispy-tests.json index 1a06a4b..2ad53b5 100644 --- a/ports/lispy-tests.json +++ b/ports/lispy-tests.json @@ -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}, From 10575c23eb6b9747eef6d925d7cadddfc95b21b7 Mon Sep 17 00:00:00 2001 From: Peter Retzlaff Date: Thu, 13 Mar 2025 09:43:06 +0100 Subject: [PATCH 3/3] Add simple test counts to semantic-test runner --- ports-rb/semantic-tests.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ports-rb/semantic-tests.rb b/ports-rb/semantic-tests.rb index 4aca9fd..6be4800 100644 --- a/ports-rb/semantic-tests.rb +++ b/ports-rb/semantic-tests.rb @@ -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"] @@ -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"