boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)