112-let-values.scm (1114B)
1 ; let-values: bind formals from each clause's value-expr. 2 3 ; Single clause, exact arity. 4 (if (= 3 (let-values (((a b) (values 1 2))) (+ a b))) 0 (sys-exit 1)) 5 6 ; Multiple clauses, accumulated bindings. 7 (if (= 36 (let-values (((a b c) (values 1 2 3)) 8 ((x y) (values 10 20))) 9 (+ a b c x y))) 10 0 (sys-exit 2)) 11 12 ; Single-name formals with a non-values value-expr. 13 (if (= 7 (let-values (((a) 7)) a)) 0 (sys-exit 3)) 14 15 ; Single-name formals with a (values x) wrapper. 16 (if (= 9 (let-values (((a) (values 9))) a)) 0 (sys-exit 4)) 17 18 ; Inits are evaluated in the OUTER env, not in each other. 19 ; Outer a=100; (+ a 1) sees outer a, so b=101. 20 (if (= 102 21 (let ((a 100)) 22 (let-values (((a b) (values 1 (+ a 1)))) 23 (+ a b)))) 24 0 (sys-exit 5)) 25 26 ; Variadic formal collects all yielded values into a list. 27 (if (equal? (list 1 2 3) 28 (let-values ((args (values 1 2 3))) args)) 29 0 (sys-exit 6)) 30 31 ; Dotted formal: head + rest. 32 (if (equal? (list 1 (list 2 3)) 33 (let-values (((h . t) (values 1 2 3))) (list h t))) 34 0 (sys-exit 7)) 35 36 (sys-exit 0)