/src/test/run-pass$ ~/pres/racket/bin/raco fmt -i **/*.scm

closure
Alona EM 2021-12-29 02:32:43 +00:00
parent 2338430e0a
commit a7e44f432c
29 changed files with 226 additions and 178 deletions

View File

@ -1,18 +1,22 @@
#lang scheme #lang scheme
(define (displayln x) (newline) (display x)) (define (displayln x)
(newline)
(display x))
(define (ambig1 x) (lambda (x) x)) (define (ambig1 x)
(lambda (x) x))
(displayln ((ambig1 13) 42)) (displayln ((ambig1 13) 42))
(define (ambig2 a) (define (ambig2 a)
(displayln a) (displayln a)
(define a- a) (define a- a)
(lambda (b) (displayln b) (lambda (b)
(displayln b)
(lambda (a) (lambda (a)
(displayln a) (displayln a)
(displayln b) (displayln b)
(displayln a-)))) (displayln a-))))
(((ambig2 1) 2) 3) (((ambig2 1) 2) 3)

View File

@ -1,12 +1,13 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (const x)
(define (const x) (lambda () x)) (lambda () x))
(define two-thunk (const 2)) (define two-thunk (const 2))
(displayln two-thunk) (displayln two-thunk)
(displayln (two-thunk)) (displayln (two-thunk))

View File

@ -3,24 +3,26 @@
(define f #f) (define f #f)
(define g #f) (define g #f)
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
((lambda () ((lambda ()
(define local 1) (define local 1)
(define (f_)
(displayln local)
(set! local 2)
(displayln local))
(set! f f_) (define (f_)
(displayln local)
(set! local 2)
(displayln local))
(define (g_) (set! f f_)
(displayln local)
(set! local 3)
(displayln local))
(set! g g_))) (define (g_)
(displayln local)
(set! local 3)
(displayln local))
(set! g g_)))
(f) (f)
(g) (g)

View File

@ -2,15 +2,16 @@
(define a 0) (define a 0)
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
((lambda ()
(define (assign)
(set! a 1))
((lambda () (define a 2)
(define (assign) (set! a 1)) (assign)
(displayln a)))
(define a 2) (displayln a)
(assign)
(displayln a)
))
(displayln a)

View File

@ -1,11 +1,14 @@
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (make-print x) (define (make-print x)
(define (print) (displayln x)) (define (print)
print) (displayln x))
print)
(define print-2 (make-print 2)) (define print-2 (make-print 2))
(define print-4 (make-print 4)) (define print-4 (make-print 4))
(print-4) (print-4)
(print-2) (print-2)

View File

@ -1,9 +1,10 @@
(define f #f) (define f #f)
(define (foo param) (define (foo param)
(define (f_) (display param)) (define (f_)
(set! f f_)) (display param))
(set! f f_))
(foo 77) (foo 77)
(f) (f)

View File

@ -1,14 +1,14 @@
; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/close_over_later_variable.lox ; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/close_over_later_variable.lox
(define (f) (define (f)
(define a 1) (define a 1)
(define b 2) (define b 2)
(define (g) (define (g)
(display b) (display b)
(newline) (newline)
(display a)) (display a))
(g)) (g))
(f) (f)

View File

@ -1,10 +1,6 @@
((lambda () ((lambda ()
(define a 1) (define a 1)
(if #f (if #f (lambda () a) 0)))
(lambda () a)
0
)
))
(display 7) (display 7)

View File

@ -3,9 +3,9 @@
(define f #f) (define f #f)
((lambda () ((lambda ()
(define local 1) (define local 1)
(define (f_) (display local)) (define (f_)
(set! f f_) (display local))
)) (set! f f_)))
(f) (f)

View File

@ -1,19 +1,22 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (outer) (define (outer)
(define x 1) (define x 1)
(define (middle)
(define (inner) (displayln x))
(displayln 2)
inner)
(displayln 3) (define (middle)
(define (inner)
(displayln x))
(displayln 2)
inner)
middle) (displayln 3)
middle)
(define mid (outer)) (define mid (outer))
(define in (mid)) (define in (mid))
(in) (in)

View File

@ -1,20 +1,24 @@
(define x 2) (define x 2)
(define (show-x) (display x) (newline)) (define (show-x)
(display x)
(newline))
(show-x) (show-x)
(set! x 3) (set! x 3)
(show-x) (show-x)
((lambda () ((lambda ()
(define x 7) (define x 7)
(show-x) (show-x)
(set! x 8) (set! x 8)
(show-x))) (show-x)))
((lambda () ((lambda ()
(define (show-x) (display x) (newline)) (define (show-x)
(define x 7) (display x)
(show-x) (newline))
(set! x 8) (define x 7)
(show-x))) (show-x)
(set! x 8)
(show-x)))

View File

@ -1,7 +1,8 @@
(define (outer) (define (outer)
(define x 0) (define x 0)
(define (y) (set! x 1)) (define (y)
(y) (set! x 1))
(display x)) (y)
(display x))
(outer) (outer)

View File

@ -1,12 +1,13 @@
; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/nested_closure.lox ; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/nested_closure.lox
#lang scheme #lang scheme
(define (displayln x)
(define (displayln x) (display x) (newline)) (display x)
(newline))
(define f #f) (define f #f)
(define (f1) (define (f1)
(define a 1) (define a 1)
(define (f2) (define (f2)
(define b 2) (define b 2)
@ -22,4 +23,4 @@
(f1) (f1)
(f) (f)

View File

@ -5,18 +5,29 @@
(define do-print 3) (define do-print 3)
(define add 4) (define add 4)
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (vector x y) (define (vector x y)
(define (add-to other) (define (add-to other)
(vector (+ x (other get-x)) (+ y (other get-y)))) (vector (+ x (other get-x)) (+ y (other get-y))))
(lambda (message) (lambda (message)
(if (= message get-x) x (if (= message get-x)
(if (= message get-y) y x
(if (= message add) add-to (if (= message get-y)
(if (= message do-print) ((lambda () (displayln x) (displayln y) (newline))) y
((lambda () (displayln -99) 0)))))))) (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)) (define v-1-7 (vector 1 7))
(displayln (v-1-7 get-x)) (displayln (v-1-7 get-x))
@ -29,4 +40,4 @@
(v-8-2 do-print) (v-8-2 do-print)
(define v-9-9 ((v-8-2 add) v-1-7)) (define v-9-9 ((v-8-2 add) v-1-7))
(v-9-9 do-print) (v-9-9 do-print)

View File

@ -2,8 +2,8 @@
; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/open_closure_in_function.lox ; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/open_closure_in_function.lox
((lambda () ((lambda ()
(define local 1) (define local 1)
(define (f) (display local)) (define (f)
(f))) (display local))
(f)))

View File

@ -12,5 +12,3 @@
(set! f f_))) (set! f f_)))
(f) (f)

View File

@ -6,7 +6,8 @@
(define f #f) (define f #f)
((lambda () ((lambda ()
(define a 1) (define a 1)
(define (f_) (display a)) (define (f_)
(display a))
(set! f f_))) (set! f f_)))
((lambda () ((lambda ()

View File

@ -1,9 +1,13 @@
(define x 2) (define x 2)
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (gy y) x) (define (gy y)
(define (gx x) x) x)
(define (gx x)
x)
(displayln (gx 7)) (displayln (gx 7))
(displayln (gy 7)) (displayln (gy 7))

View File

@ -1,14 +1,15 @@
; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/shadow_closure_with_local.lox ; https://github.com/munificent/craftinginterpreters/blob/master/test/closure/shadow_closure_with_local.lox
; TODO: Forbid this https://discordapp.com/channels/571040468092321801/618895179343986688/925533402592079912 ; TODO: Forbid this https://discordapp.com/channels/571040468092321801/618895179343986688/925533402592079912
(define (displayln x)
(define (displayln x) (display x) (newline)) (display x)
(newline))
((lambda () ((lambda ()
(define foo 0) (define foo 0)
(define (f) (define (f)
((lambda () ((lambda ()
(displayln foo) (displayln foo)
(define foo 1) (define foo 1)
(displayln foo)))) (displayln foo))))
(f))) (f)))

View File

@ -1,25 +1,19 @@
(define closure #f) (define closure #f)
((lambda () ((lambda ()
(define a 1) (define a 1)
((lambda ()
(define b 2)
((lambda () (define (get-a)
(define b 2) a)
(define (get-a) a) (set! closure get-a)
(set! closure get-a) (if #f (lambda () b) 0)))
(if #f (display (closure))))
(lambda () b)
0)
))
(display (closure))
))
(newline) (newline)
(display (closure)) (display (closure))

View File

@ -1,8 +1,8 @@
(define (outer) (define (outer)
(define x 1) (define x 1)
(define (inner) (display x)) (define (inner)
inner) (display x))
inner)
(define clousre (outer)) (define clousre (outer))
(clousre) (clousre)

View File

@ -2,16 +2,18 @@
(define globalGet #f) (define globalGet #f)
(define (main) (define (main)
(define a 0) (define a 0)
(define (set) (set! a 1)) (define (set)
(define (get) (display a) (newline)) (set! a 1))
(define (get)
(display a)
(newline))
(set! globalSet set) (set! globalSet set)
(set! globalGet get) (set! globalGet get))
)
(main) (main)
(globalGet) (globalGet)
(globalSet) (globalSet)
(globalGet) (globalGet)

View File

@ -1,7 +1,10 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (curry2 f) (lambda (l) (lambda (r) (f l r)))) (define (curry2 f)
(lambda (l) (lambda (r) (f l r))))
(displayln (((curry2 +) 1) 2)) (displayln (((curry2 +) 1) 2))

View File

@ -1,21 +1,28 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define (my-or a b) (if a #t b)) ; Test was written before we had `or` (define (my-or a b)
(if a #t b)) ; Test was written before we had `or`
(define (fib-base? n)
(define (fib-base? n) (my-or (= n 1) (= n 0))) (my-or (= n 1) (= n 0)))
(define (fib n) (define (fib n)
(if (fib-base? n) 1 (if (fib-base? n) 1 (+ (fib (- n 1)) (fib (- n 2)))))
(+ (fib (- n 1)) (fib (- n 2)))))
(define (pfib n) (displayln n) (displayln (fib n)) (newline)) (define (pfib n)
(displayln n)
(displayln (fib n))
(newline))
(define (pfibs n) (define (pfibs n)
(if (= n (- 1)) 0 ; Hack (if (= n (- 1))
((lambda () (pfib n) (pfibs (- n 1)))))) ; Hack 0 ; Hack
((lambda ()
(pfib n)
(pfibs (- n 1)))))) ; Hack
(pfibs 10) (pfibs 10)

View File

@ -1,6 +1,8 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(display x)
(newline))
(define add1 +) (define add1 +)
(displayln (add1 2 3)) (displayln (add1 2 3))
@ -8,5 +10,6 @@
(define add2 (lambda (a b) (+ a b))) (define add2 (lambda (a b) (+ a b)))
(displayln (add2 5 6)) (displayln (add2 5 6))
(define (add3 a b) (+ a b)) (define (add3 a b)
(displayln (add3 5 9)) (+ a b))
(displayln (add3 5 9))

View File

@ -1,18 +1,24 @@
#lang scheme #lang scheme
(define (displayln x) (display x) (newline)) (define (displayln x)
(define (printbool x) (displayln (bool->int x))) (display x)
(newline))
(define (printbool x)
(displayln (bool->int x)))
(define (true x y) x) (define (true x y)
(define (false x y) y) x)
(define (and x y) (x y x)) (define (false x y)
(define (or x y) (x x y)) y)
(define (not x) (x false true)) (define (and x y)
(x y x))
(define (or x y)
(x x y))
(define (not x)
(x false true))
(define (bool->int x) (define (bool->int x)
(if (if (equal? x true) 1 (if (equal? x false) 0 (- 1))))
(equal? x true) 1
(if (equal? x false) 0 (- 1))))
(printbool true) (printbool true)
(printbool false) (printbool false)
@ -27,4 +33,4 @@
(printbool (or true false)) (printbool (or true false))
(printbool (or false true)) (printbool (or false true))
(printbool (or false false)) (printbool (or false false))
(printbool (and (or true false) (or false true))) (printbool (and (or true false) (or false true)))

View File

@ -1,5 +1,8 @@
#lang scheme #lang scheme
(define (multi) 1 2 3) (define (multi)
1
2
3)
(display (multi)) (display (multi))

View File

@ -6,15 +6,14 @@
(define (sqrt x) (define (sqrt x)
(define (sqrt-iter guess x) (define (sqrt-iter guess x)
(define (good-enough? guess x) (define (good-enough? guess x)
(define (square x) (* x x)) (define (square x)
(* x x))
(< (abs (- (square guess) x)) 0.001)) (< (abs (- (square guess) x)) 0.001))
(define (improve guess x) (define (improve guess x)
(define (average x y) (define (average x y)
(/ (+ x y) 2)) (/ (+ x y) 2))
(average guess (/ x guess))) (average guess (/ x guess)))
(if (good-enough? guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))
guess
(sqrt-iter (improve guess x) x)))
(sqrt-iter 1.0 x)) (sqrt-iter 1.0 x))
(display (sqrt 2)) (display (sqrt 2))

View File

@ -4,17 +4,16 @@
; http://sarabander.github.io/sicp/html/1_002e1.xhtml#g_t1_002e1_002e7 ; http://sarabander.github.io/sicp/html/1_002e1.xhtml#g_t1_002e1_002e7
(define (sqrt-iter guess x) (define (sqrt-iter guess x)
(if (good-enough? guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))
guess
(sqrt-iter (improve guess x) x)))
(define (improve guess x) (define (improve guess x)
(average guess (/ x guess))) (average guess (/ x guess)))
(define (average x y) (define (average x y)
(/ (+ x y) 2)) (/ (+ x y) 2))
(define (square x) (* x x)) (define (square x)
(* x x))
(define (good-enough? guess x) (define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001)) (< (abs (- (square guess) x)) 0.001))
@ -22,4 +21,4 @@
(define (sqrt x) (define (sqrt x)
(sqrt-iter 1.0 x)) (sqrt-iter 1.0 x))
(display (sqrt 2)) (display (sqrt 2))