((lambda () ## test return variables | v1 v2 v3 i a b c d | (set i 100) (defun ff(a b ::: x y z) (set x (+ a b i)) (set y (+ x x)) (set z (+ 999 i)) (set i (* i 10)) ) (set-r v1 v2 v3 (ff 10 20)) (if (/= v1 130) (printf "ERROR: v1 must be 130\n")) (if (/= v2 260) (printf "ERROR: v2 must be 260\n")) (if (/= v3 1099) (printf "ERROR: v3 must be 1099\n")) (printf "OK v1=%d v2=%d v3=%d\n" v1 v2 v3) (set-r v1 v2 (ff 1 2)) ## using 2 return variables only. not assigning to v3 (if (/= v1 1003) (printf "ERROR: v1 must be 1003\n")) (if (/= v2 2006) (printf "ERROR: v2 must be 2006\n")) (if (/= v3 1099) (printf "ERROR: v3 must be 1099\n")) (printf "OK v1=%d v2=%d v3=%d\n" v1 v2 v3) ## test return variables in message sends (defclass B ::: | X1 X2 | (set X1 999) (set X2 888) (defun ::: get ( ::: x y) (set x X1) (set y X2) ) (defun ::: get2 (inc ::: x y) (set x (+ X1 inc)) (set y (+ X2 inc)) ) ) (set-r a b (:B get)) (set-r c d (:B get2 -100)) (if (/= a 999) (printf "ERROR: a must be 999\n")) (if (/= b 888) (printf "ERROR: b must be 888\n")) (if (/= c 899) (printf "ERROR: c must be 899\n")) (if (/= d 788) (printf "ERROR: d must be 788\n")) (printf "OK a=%d b=%d c=%d d=%d\n" a b c d) ))