0
@@ -3,18 +3,18 @@ require 'test_helper'
0
class BusSchemeLambdaTest < Test::Unit::TestCase
0
- l = eval
("(lambda () (+ 1 1))")
0
+ l = eval
!("(lambda () (+ 1 1))")
0
assert_equal [[:+.sym, 1, 1].to_list], l.body
0
assert_equal 0, l.formals.length
0
- eval
("(define foo (lambda () (+ 1 1)))")
0
+ eval
!("(define foo (lambda () (+ 1 1)))")
0
assert BusScheme[:foo.sym].is_a?(Lambda)
0
assert_evals_to 2, [:foo.sym]
0
def test_lambda_with_arg
0
- eval
("(define foo (lambda (x) (+ x 1)))")
0
+ eval
!("(define foo (lambda (x) (+ x 1)))")
0
assert_evals_to 2, "(foo 1)"
0
@@ -23,39 +23,39 @@ class BusSchemeLambdaTest < Test::Unit::TestCase
0
def test_lambda_with_incorrect_arity
0
- eval
("(define foo (lambda (x) (+ x 1)))")
0
+ eval
!("(define foo (lambda (x) (+ x 1)))")
0
assert_raises(ArgumentError) { assert_evals_to 2, "(foo 1 3)" }
0
def test_lambda_args_dont_stay_in_scope
0
clear_symbols(:x, :foo)
0
- eval
("(define foo (lambda (x) (+ x 1)))")
0
+ eval
!("(define foo (lambda (x) (+ x 1)))")
0
assert ! BusScheme.in_scope?(:x)
0
assert_evals_to 2, "(foo 1)"
0
assert ! BusScheme.in_scope?(:x)
0
def test_lambda_calls_lambda
0
- eval "(define f (lambda (x) (+ 3 x)))"
0
- eval "(define g (lambda (y) (* 3 y)))"
0
+ eval! "(define f (lambda (x) (+ 3 x)))"
0
+ eval! "(define g (lambda (y) (* 3 y)))"
0
assert_evals_to 12, "(f (g 3))"
0
assert_evals_to 1, "((lambda () ((lambda () 1))))"
0
def test_enforces_arg_count
0
- assert_equal 3, eval
("(lambda (x y z) z)").formals.size
0
+ assert_equal 3, eval
!("(lambda (x y z) z)").formals.size
0
assert_raises(ArgumentError) do
0
- eval
"((lambda (x) x))"
0
+ eval
! "((lambda (x) x))"
0
def test_lambda_closures
0
assert_evals_to 3, "((lambda (x) ((lambda (y) 3) 1)) 1)"
0
- eval
"(define foo (lambda (xx) ((lambda (y) (+ xx y)) (* xx 2))))"
0
+ eval
! "(define foo (lambda (xx) ((lambda (y) (+ xx y)) (* xx 2))))"
0
assert foo = BusScheme[:foo.sym]
0
assert_evals_to 3, foo.call(1)
0
- eval
"(define holder ((lambda (x) (lambda () x)) 2))"
0
+ eval
! "(define holder ((lambda (x) (lambda () x)) 2))"
0
assert_evals_to 2, "(holder)"
0
@@ -82,7 +82,7 @@ class BusSchemeLambdaTest < Test::Unit::TestCase
0
def test_nested_function_calls_dont_affect_caller
0
- eval
"(define fib (lambda (x)
0
+ eval
! "(define fib (lambda (x)
0
(+ (fib (- x 1)) (fib (- x 2))))))"
0
@@ -92,34 +92,34 @@ class BusSchemeLambdaTest < Test::Unit::TestCase
0
def test_lambda_rest_args
0
- eval
"(define rest (lambda args args))"
0
+ eval
! "(define rest (lambda args args))"
0
assert_evals_to [:a.sym, :b.sym, :c.sym].to_list, "(rest 'a 'b 'c)"
0
- eval '(load "test/tracer.scm")'
0
- assert_equal ["(eval):1 in top-level"], eval("(stacktrace)")
0
+ eval! '(load "test/tracer.scm")'
0
+ assert_equal ["(eval):1 in top-level"], eval!("(stacktrace)")
0
assert_equal(["test/tracer.scm:1 in f",
0
"test/tracer.scm:4 in g",
0
"(eval):1 in (anonymous)",
0
"(eval):0 in top-level"
0
- eval
("((lambda () (g)))"))
0
+ eval
!("((lambda () (g)))"))
0
# TODO: check the stack traces that the scheme tests give
0
- eval
"(define stack-growth
0
+ eval
! "(define stack-growth
0
(lambda () (ruby \"raise 'wtf' if BusScheme.stack.size < 1\")))"
0
+ eval
! "(stack-growth)"
0
def test_primitives_live_on_stack
0
BusScheme.define 'stack-growth', BusScheme.primitive { assert BusScheme.stack.size > 1 }
0
assert SYMBOL_TABLE.has_key?('stack-growth'.sym)
0
+ eval
! "(stack-growth)"
0
@@ -127,4 +127,12 @@ class BusSchemeLambdaTest < Test::Unit::TestCase
0
assert_equal [1, 2, 3, 4, 5, 6], a.flatten_non_recursive
0
assert_equal({ 1 => 2, 3 => 4, 5 => 6 }, a.to_hash)
0
+ def test_lambdas_accept_list_of_args
0
+ BusScheme['prim'] = Primitive.new(lambda { |args| assert args.is_a?(Cons) })
0
+ BusScheme['prim'].call(cons(1))
0
+ apply(:prim.sym, cons(1, cons(2)))
Comments
No one has commented yet.