/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
(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))
(define (ambig2 a)
(displayln a)
(define a- a)
(lambda (b) (displayln b)
(lambda (b)
(displayln b)
(lambda (a)
(displayln a)
(displayln b)
(displayln a-))))
(((ambig2 1) 2) 3)
(((ambig2 1) 2) 3)

View File

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

View File

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

View File

@ -2,15 +2,16 @@
(define a 0)
(define (displayln x) (display x) (newline))
(define (displayln x)
(display x)
(newline))
((lambda ()
(define (assign)
(set! a 1))
((lambda ()
(define (assign) (set! a 1))
(define a 2)
(assign)
(displayln a)))
(define a 2)
(assign)
(displayln a)
))
(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 (print) (displayln x))
print)
(define (print)
(displayln x))
print)
(define print-2 (make-print 2))
(define print-4 (make-print 4))
(print-4)
(print-2)
(print-2)

View File

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

View File

@ -1,14 +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 a 1)
(define b 2)
(define (g)
(display b)
(newline)
(display a))
(define (g)
(display b)
(newline)
(display a))
(g))
(g))
(f)
(f)

View File

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

View File

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

View File

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

View File

@ -1,20 +1,24 @@
(define x 2)
(define (show-x) (display x) (newline))
(define (show-x)
(display x)
(newline))
(show-x)
(set! x 3)
(show-x)
((lambda ()
(define x 7)
(show-x)
(set! x 8)
(show-x)))
(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)))
(define (show-x)
(display x)
(newline))
(define x 7)
(show-x)
(set! x 8)
(show-x)))

View File

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

View File

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

View File

@ -5,18 +5,29 @@
(define do-print 3)
(define add 4)
(define (displayln x) (display x) (newline))
(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))))))))
(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))
@ -29,4 +40,4 @@
(v-8-2 do-print)
(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
((lambda ()
(define local 1)
(define (f) (display local))
(f)))
(define (f)
(display local))
(f)))

View File

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

View File

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

View File

@ -1,9 +1,13 @@
(define x 2)
(define (displayln x) (display x) (newline))
(define (displayln x)
(display x)
(newline))
(define (gy y) x)
(define (gx x) x)
(define (gy y)
x)
(define (gx x)
x)
(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
; TODO: Forbid this https://discordapp.com/channels/571040468092321801/618895179343986688/925533402592079912
(define (displayln x) (display x) (newline))
(define (displayln x)
(display x)
(newline))
((lambda ()
(define foo 0)
(define (f)
(define (f)
((lambda ()
(displayln foo)
(define foo 1)
(displayln foo))))
(f)))
(displayln foo))))
(f)))

View File

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

View File

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

View File

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

View File

@ -1,7 +1,10 @@
#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))

View File

@ -1,21 +1,28 @@
#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) (my-or (= n 1) (= n 0)))
(define (fib-base? n)
(my-or (= n 1) (= n 0)))
(define (fib n)
(if (fib-base? n) 1
(+ (fib (- n 1)) (fib (- n 2)))))
(if (fib-base? n) 1 (+ (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)
(if (= n (- 1)) 0 ; Hack
((lambda () (pfib n) (pfibs (- n 1)))))) ; Hack
(if (= n (- 1))
0 ; Hack
((lambda ()
(pfib n)
(pfibs (- n 1)))))) ; Hack
(pfibs 10)
(pfibs 10)

View File

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

View File

@ -1,18 +1,24 @@
#lang scheme
(define (displayln x) (display x) (newline))
(define (printbool x) (displayln (bool->int x)))
(define (displayln x)
(display x)
(newline))
(define (printbool x)
(displayln (bool->int x)))
(define (true x y) x)
(define (false x y) y)
(define (and x y) (x y x))
(define (or x y) (x x y))
(define (not x) (x false true))
(define (true x y)
x)
(define (false x y)
y)
(define (and x y)
(x y x))
(define (or x y)
(x x y))
(define (not x)
(x false true))
(define (bool->int x)
(if
(equal? x true) 1
(if (equal? x false) 0 (- 1))))
(define (bool->int x)
(if (equal? x true) 1 (if (equal? x false) 0 (- 1))))
(printbool true)
(printbool false)
@ -27,4 +33,4 @@
(printbool (or true false))
(printbool (or false true))
(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
(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-iter guess x)
(define (good-enough? guess x)
(define (square x) (* x x))
(define (square x)
(* x x))
(< (abs (- (square guess) x)) 0.001))
(define (improve guess x)
(define (average x y)
(define (average x y)
(/ (+ x y) 2))
(average guess (/ x guess)))
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(if (good-enough? guess x) guess (sqrt-iter (improve guess x) 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
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))
(define (improve guess x)
(average guess (/ x guess)))
(define (average x y)
(define (average x y)
(/ (+ x y) 2))
(define (square x) (* x x))
(define (square x)
(* x x))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
@ -22,4 +21,4 @@
(define (sqrt x)
(sqrt-iter 1.0 x))
(display (sqrt 2))
(display (sqrt 2))