diff --git a/README.md b/README.md new file mode 100644 index 0000000..1effd75 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## Credits + +Many of the tests are adapted from [craftinginterpriters](https://github.com/munificent/craftinginterpreters/tree/master/test). \ No newline at end of file diff --git a/src/snapshots/handball__tests__run-pass@4-1-6-Assignments.scm.snap b/src/snapshots/handball__tests__run-pass@4-1-6-Assignments.scm.snap new file mode 100644 index 0000000..d8a09b3 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@4-1-6-Assignments.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass r7rs-spec\\4-1-6-Assignments.scm" + +--- +3.05.0 diff --git a/src/snapshots/handball__tests__run-pass@assign-closures.scm.snap b/src/snapshots/handball__tests__run-pass@assign-closures.scm.snap new file mode 100644 index 0000000..4aa09ff --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@assign-closures.scm.snap @@ -0,0 +1,11 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\assign-closures.scm" + +--- +1.0 +2.0 +2.0 +3.0 + diff --git a/src/snapshots/handball__tests__run-pass@assign-shadowed-later.scm.snap b/src/snapshots/handball__tests__run-pass@assign-shadowed-later.scm.snap new file mode 100644 index 0000000..a1e7c91 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@assign-shadowed-later.scm.snap @@ -0,0 +1,9 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\assign-shadowed-later.scm" + +--- +1.0 +0.0 + diff --git a/src/snapshots/handball__tests__run-pass@bagel-donut.scm.snap b/src/snapshots/handball__tests__run-pass@bagel-donut.scm.snap new file mode 100644 index 0000000..93d1fbe --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@bagel-donut.scm.snap @@ -0,0 +1,9 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\bagel-donut.scm" + +--- +4.0 +2.0 + diff --git a/src/snapshots/handball__tests__run-pass@close-over-function-param.scm.snap b/src/snapshots/handball__tests__run-pass@close-over-function-param.scm.snap new file mode 100644 index 0000000..050e695 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@close-over-function-param.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\close-over-function-param.scm" + +--- +77.0 diff --git a/src/snapshots/handball__tests__run-pass@close-over-later-variable.scm.snap b/src/snapshots/handball__tests__run-pass@close-over-later-variable.scm.snap new file mode 100644 index 0000000..49ff729 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@close-over-later-variable.scm.snap @@ -0,0 +1,8 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\close-over-later-variable.scm" + +--- +2.0 +1.0 diff --git a/src/snapshots/handball__tests__run-pass@close-unused.scm.snap b/src/snapshots/handball__tests__run-pass@close-unused.scm.snap new file mode 100644 index 0000000..8c5eeb6 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@close-unused.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\close-unused.scm" + +--- +7.0 diff --git a/src/snapshots/handball__tests__run-pass@closed-closure-in-function.scm.snap b/src/snapshots/handball__tests__run-pass@closed-closure-in-function.scm.snap new file mode 100644 index 0000000..9743e0c --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@closed-closure-in-function.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\closed-closure-in-function.scm" + +--- +1.0 diff --git a/src/snapshots/handball__tests__run-pass@gnarly-i.scm.snap b/src/snapshots/handball__tests__run-pass@gnarly-i.scm.snap new file mode 100644 index 0000000..1b7b569 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@gnarly-i.scm.snap @@ -0,0 +1,10 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\gnarly-i.scm" + +--- +3.0 +2.0 +1.0 + diff --git a/src/snapshots/handball__tests__run-pass@mutate-levels.scm.snap b/src/snapshots/handball__tests__run-pass@mutate-levels.scm.snap new file mode 100644 index 0000000..6853d0e --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@mutate-levels.scm.snap @@ -0,0 +1,13 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\mutate-levels.scm" + +--- +2.0 +3.0 +3.0 +3.0 +7.0 +8.0 + diff --git a/src/snapshots/handball__tests__run-pass@nested-assign.scm.snap b/src/snapshots/handball__tests__run-pass@nested-assign.scm.snap new file mode 100644 index 0000000..744868e --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@nested-assign.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\nested-assign.scm" + +--- +1.0 diff --git a/src/snapshots/handball__tests__run-pass@nested-closure.scm.snap b/src/snapshots/handball__tests__run-pass@nested-closure.scm.snap new file mode 100644 index 0000000..744940e --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@nested-closure.scm.snap @@ -0,0 +1,10 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\nested-closure.scm" + +--- +1.0 +2.0 +3.0 + diff --git a/src/snapshots/handball__tests__run-pass@objects-are-a-poor-mans-closure.scm.snap b/src/snapshots/handball__tests__run-pass@objects-are-a-poor-mans-closure.scm.snap new file mode 100644 index 0000000..e290ade --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@objects-are-a-poor-mans-closure.scm.snap @@ -0,0 +1,20 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\objects-are-a-poor-mans-closure.scm" + +--- +1.0 +7.0 +1.0 +7.0 + +8.0 +2.0 +8.0 +2.0 + +9.0 +9.0 + + diff --git a/src/snapshots/handball__tests__run-pass@open-closure-in-function.scm.snap b/src/snapshots/handball__tests__run-pass@open-closure-in-function.scm.snap new file mode 100644 index 0000000..6c929d9 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@open-closure-in-function.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\open-closure-in-function.scm" + +--- +1.0 diff --git a/src/snapshots/handball__tests__run-pass@reference-closure-multiple-times.scm.snap b/src/snapshots/handball__tests__run-pass@reference-closure-multiple-times.scm.snap new file mode 100644 index 0000000..a7095a5 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@reference-closure-multiple-times.scm.snap @@ -0,0 +1,8 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\reference-closure-multiple-times.scm" + +--- +1.0 +1.0 diff --git a/src/snapshots/handball__tests__run-pass@reuse-closure-slot.scm.snap b/src/snapshots/handball__tests__run-pass@reuse-closure-slot.scm.snap new file mode 100644 index 0000000..f3b7b5a --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@reuse-closure-slot.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\reuse-closure-slot.scm" + +--- +1.0 diff --git a/src/snapshots/handball__tests__run-pass@scope.scm.snap b/src/snapshots/handball__tests__run-pass@scope.scm.snap new file mode 100644 index 0000000..2474233 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@scope.scm.snap @@ -0,0 +1,9 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\scope.scm" + +--- +7.0 +2.0 + diff --git a/src/snapshots/handball__tests__run-pass@shadow-closure-with-local.scm.snap b/src/snapshots/handball__tests__run-pass@shadow-closure-with-local.scm.snap new file mode 100644 index 0000000..7ed2745 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@shadow-closure-with-local.scm.snap @@ -0,0 +1,9 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\shadow-closure-with-local.scm" + +--- +0.0 +1.0 + diff --git a/src/snapshots/handball__tests__run-pass@unused-later-closures.scm.snap b/src/snapshots/handball__tests__run-pass@unused-later-closures.scm.snap new file mode 100644 index 0000000..82b2efb --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@unused-later-closures.scm.snap @@ -0,0 +1,8 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\unused-later-closures.scm" + +--- +1.0 +1.0 diff --git a/src/snapshots/handball__tests__run-pass@use-after-close.scm.snap b/src/snapshots/handball__tests__run-pass@use-after-close.scm.snap new file mode 100644 index 0000000..5641625 --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@use-after-close.scm.snap @@ -0,0 +1,7 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\use-after-close.scm" + +--- +1.0 diff --git a/src/snapshots/handball__tests__run-pass@val-or-var.scm.snap b/src/snapshots/handball__tests__run-pass@val-or-var.scm.snap new file mode 100644 index 0000000..bb679ec --- /dev/null +++ b/src/snapshots/handball__tests__run-pass@val-or-var.scm.snap @@ -0,0 +1,9 @@ +--- +source: src/tests.rs +assertion_line: 41 +expression: "run-pass closure\\val-or-var.scm" + +--- +0.0 +1.0 + diff --git a/src/test/run-pass/closure/assign-closures.scm b/src/test/run-pass/closure/assign-closures.scm new file mode 100644 index 0000000..ca65638 --- /dev/null +++ b/src/test/run-pass/closure/assign-closures.scm @@ -0,0 +1,26 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/assign_to_closure.lox + +(define f #f) +(define g #f) + +(define (displayln x) (display x) (newline)) + +((lambda () + (define local 1) + + (define (f_) + (displayln local) + (set! local 2) + (displayln local)) + + (set! f f_) + + (define (g_) + (displayln local) + (set! local 3) + (displayln local)) + + (set! g g_))) + +(f) +(g) \ No newline at end of file diff --git a/src/test/run-pass/closure/assign-shadowed-later.scm b/src/test/run-pass/closure/assign-shadowed-later.scm new file mode 100644 index 0000000..b8986b5 --- /dev/null +++ b/src/test/run-pass/closure/assign-shadowed-later.scm @@ -0,0 +1,16 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/assign_to_shadowed_later.lox + +(define a 0) + +(define (displayln x) (display x) (newline)) + + +((lambda () + (define (assign) (set! a 1)) + + (define a 2) + (assign) + (displayln a) +)) + +(displayln a) \ No newline at end of file diff --git a/src/test/run-pass/closure/bagel-donut.scm b/src/test/run-pass/closure/bagel-donut.scm new file mode 100644 index 0000000..b40e8c5 --- /dev/null +++ b/src/test/run-pass/closure/bagel-donut.scm @@ -0,0 +1,11 @@ +(define (displayln x) (display x) (newline)) + +(define (make-print x) + (define (print) (displayln x)) + print) + +(define print-2 (make-print 2)) +(define print-4 (make-print 4)) + +(print-4) +(print-2) \ No newline at end of file diff --git a/src/test/run-pass/closure/close-over-function-param.scm b/src/test/run-pass/closure/close-over-function-param.scm new file mode 100644 index 0000000..ed6c9a9 --- /dev/null +++ b/src/test/run-pass/closure/close-over-function-param.scm @@ -0,0 +1,9 @@ +(define f #f) + +(define (foo param) + (define (f_) (display param)) + (set! f f_)) + +(foo 77) + +(f) \ No newline at end of file diff --git a/src/test/run-pass/closure/close-over-later-variable.scm b/src/test/run-pass/closure/close-over-later-variable.scm new file mode 100644 index 0000000..81370e8 --- /dev/null +++ b/src/test/run-pass/closure/close-over-later-variable.scm @@ -0,0 +1,14 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/close_over_later_variable.lox + +(define (f) + (define a 1) + (define b 2) + + (define (g) + (display b) + (newline) + (display a)) + + (g)) + +(f) \ No newline at end of file diff --git a/src/test/run-pass/closure/close-unused.scm b/src/test/run-pass/closure/close-unused.scm new file mode 100644 index 0000000..b237a89 --- /dev/null +++ b/src/test/run-pass/closure/close-unused.scm @@ -0,0 +1,10 @@ +((lambda () + (define a 1) + + (if #f + (lambda () a) + 0 + ) +)) + +(display 7) \ No newline at end of file diff --git a/src/test/run-pass/closure/closed-closure-in-function.scm b/src/test/run-pass/closure/closed-closure-in-function.scm new file mode 100644 index 0000000..3c9874e --- /dev/null +++ b/src/test/run-pass/closure/closed-closure-in-function.scm @@ -0,0 +1,11 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/closed_closure_in_function.lox + +(define f #f) + +((lambda () + (define local 1) + (define (f_) (display local)) + (set! f f_) +)) + +(f) \ No newline at end of file diff --git a/src/test/run-pass/closure/gnarly-i.scm b/src/test/run-pass/closure/gnarly-i.scm new file mode 100644 index 0000000..870b38d --- /dev/null +++ b/src/test/run-pass/closure/gnarly-i.scm @@ -0,0 +1,19 @@ +#lang scheme + +(define (displayln x) (display x) (newline)) + +(define (outer) + (define x 1) + + (define (middle) + (define (inner) (displayln x)) + (displayln 2) + inner) + + (displayln 3) + + middle) + +(define mid (outer)) +(define in (mid)) +(in) \ No newline at end of file diff --git a/src/test/run-pass/closure/mutate-levels.scm b/src/test/run-pass/closure/mutate-levels.scm new file mode 100644 index 0000000..d43ccbf --- /dev/null +++ b/src/test/run-pass/closure/mutate-levels.scm @@ -0,0 +1,20 @@ +(define x 2) + +(define (show-x) (display x) (newline)) + +(show-x) +(set! x 3) +(show-x) + +((lambda () + (define x 7) + (show-x) + (set! x 8) + (show-x))) + +((lambda () + (define (show-x) (display x) (newline)) + (define x 7) + (show-x) + (set! x 8) + (show-x))) diff --git a/src/test/run-pass/closure/nested-assign.scm b/src/test/run-pass/closure/nested-assign.scm new file mode 100644 index 0000000..df1a580 --- /dev/null +++ b/src/test/run-pass/closure/nested-assign.scm @@ -0,0 +1,7 @@ +(define (outer) + (define x 0) + (define (y) (set! x 1)) + (y) + (display x)) + +(outer) \ No newline at end of file diff --git a/src/test/run-pass/closure/nested-closure.scm b/src/test/run-pass/closure/nested-closure.scm new file mode 100644 index 0000000..c0f58cb --- /dev/null +++ b/src/test/run-pass/closure/nested-closure.scm @@ -0,0 +1,25 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/nested_closure.lox +#lang scheme + + +(define (displayln x) (display x) (newline)) + +(define f #f) + +(define (f1) + (define a 1) + (define (f2) + (define b 2) + (define (f3) + (define c 3) + (define (f4) + (displayln a) + (displayln b) + (displayln c)) + (set! f f4)) + (f3)) + (f2)) + +(f1) + +(f) \ No newline at end of file diff --git a/src/test/run-pass/closure/objects-are-a-poor-mans-closure.scm b/src/test/run-pass/closure/objects-are-a-poor-mans-closure.scm new file mode 100644 index 0000000..2e4e182 --- /dev/null +++ b/src/test/run-pass/closure/objects-are-a-poor-mans-closure.scm @@ -0,0 +1,32 @@ +#lang scheme + +(define get-x 1) +(define get-y 2) +(define do-print 3) +(define add 4) + +(define (displayln x) (display x) (newline)) + +(define (vector x y) + (define (add-to other) + (vector (+ x (other get-x)) (+ y (other get-y)))) + + (lambda (message) + (if (= message get-x) x + (if (= message get-y) y + (if (= message add) add-to + (if (= message do-print) ((lambda () (displayln x) (displayln y) (newline))) + ((lambda () (displayln -99) 0)))))))) + +(define v-1-7 (vector 1 7)) +(displayln (v-1-7 get-x)) +(displayln (v-1-7 get-y)) +(v-1-7 do-print) + +(define v-8-2 (vector 8 2)) +(displayln (v-8-2 get-x)) +(displayln (v-8-2 get-y)) +(v-8-2 do-print) + +(define v-9-9 ((v-8-2 add) v-1-7)) +(v-9-9 do-print) \ No newline at end of file diff --git a/src/test/run-pass/closure/open-closure-in-function.scm b/src/test/run-pass/closure/open-closure-in-function.scm new file mode 100644 index 0000000..a261912 --- /dev/null +++ b/src/test/run-pass/closure/open-closure-in-function.scm @@ -0,0 +1,9 @@ +#lang scheme + +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/open_closure_in_function.lox + + +((lambda () + (define local 1) + (define (f) (display local)) + (f))) \ No newline at end of file diff --git a/src/test/run-pass/closure/reference-closure-multiple-times.scm b/src/test/run-pass/closure/reference-closure-multiple-times.scm new file mode 100644 index 0000000..2a41c5e --- /dev/null +++ b/src/test/run-pass/closure/reference-closure-multiple-times.scm @@ -0,0 +1,16 @@ +#lang scheme +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/reference_closure_multiple_times.lox + +(define f #f) + +((lambda () + (define a 1) + (define (f_) + (display a) + (newline) + (display a)) + (set! f f_))) + +(f) + + diff --git a/src/test/run-pass/closure/reuse-closure-slot.scm b/src/test/run-pass/closure/reuse-closure-slot.scm new file mode 100644 index 0000000..44f1d73 --- /dev/null +++ b/src/test/run-pass/closure/reuse-closure-slot.scm @@ -0,0 +1,14 @@ +#lang scheme + +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/reuse_closure_slot.lox + +((lambda () + (define f #f) + ((lambda () + (define a 1) + (define (f_) (display a)) + (set! f f_))) + + ((lambda () + (define b 2) + (f))))) diff --git a/src/test/run-pass/closure/scope.scm b/src/test/run-pass/closure/scope.scm new file mode 100644 index 0000000..12c1842 --- /dev/null +++ b/src/test/run-pass/closure/scope.scm @@ -0,0 +1,9 @@ +(define x 2) + +(define (displayln x) (display x) (newline)) + +(define (gy y) x) +(define (gx x) x) + +(displayln (gx 7)) +(displayln (gy 7)) \ No newline at end of file diff --git a/src/test/run-pass/closure/shadow-closure-with-local.scm b/src/test/run-pass/closure/shadow-closure-with-local.scm new file mode 100644 index 0000000..6a8b94b --- /dev/null +++ b/src/test/run-pass/closure/shadow-closure-with-local.scm @@ -0,0 +1,14 @@ +; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/shadow_closure_with_local.lox +; TODO: Forbid this https://discordapp.com/channels/571040468092321801/618895179343986688/925533402592079912 + + +(define (displayln x) (display x) (newline)) + +((lambda () + (define foo 0) + (define (f) + ((lambda () + (displayln foo) + (define foo 1) + (displayln foo)))) + (f))) \ No newline at end of file diff --git a/src/test/run-pass/closure/unused-later-closures.scm b/src/test/run-pass/closure/unused-later-closures.scm new file mode 100644 index 0000000..8ed1c15 --- /dev/null +++ b/src/test/run-pass/closure/unused-later-closures.scm @@ -0,0 +1,25 @@ +(define closure #f) + +((lambda () + (define a 1) + + + ((lambda () + (define b 2) + + (define (get-a) a) + + (set! closure get-a) + + (if #f + (lambda () b) + 0) + + )) + + (display (closure)) + +)) + +(newline) + (display (closure)) diff --git a/src/test/run-pass/closure/use-after-close.scm b/src/test/run-pass/closure/use-after-close.scm new file mode 100644 index 0000000..e6f91e9 --- /dev/null +++ b/src/test/run-pass/closure/use-after-close.scm @@ -0,0 +1,8 @@ +(define (outer) + (define x 1) + (define (inner) (display x)) + inner) + +(define clousre (outer)) +(clousre) + diff --git a/src/test/run-pass/closure/val-or-var.scm b/src/test/run-pass/closure/val-or-var.scm new file mode 100644 index 0000000..cc40067 --- /dev/null +++ b/src/test/run-pass/closure/val-or-var.scm @@ -0,0 +1,17 @@ +(define globalSet #f) +(define globalGet #f) + +(define (main) + (define a 0) + + (define (set) (set! a 1)) + (define (get) (display a) (newline)) + + (set! globalSet set) + (set! globalGet get) +) + +(main) +(globalGet) +(globalSet) +(globalGet) \ No newline at end of file diff --git a/src/test/run-pass/r7rs-spec/4-1-6-Assignments.scm b/src/test/run-pass/r7rs-spec/4-1-6-Assignments.scm new file mode 100644 index 0000000..1ba7aca --- /dev/null +++ b/src/test/run-pass/r7rs-spec/4-1-6-Assignments.scm @@ -0,0 +1,4 @@ +(define x 2) +(display (+ x 1)) +(set! x 4) +(display (+ x 1))