Problem 12 (150pts): and & or
Implement do_and_form
and do_or_form
so that and
and or expressions (spec) are evaluated correctly.
The logical forms and
and or
are short-circuiting. For and
, your interpreter should evaluate each sub-expression from left to right, and if any of these is a false value, return that value. Otherwise, return the value of the last sub-expression. If there are no sub-expressions in an and
expression, it evaluates to #t
.
scm> (and)
#t
scm> (and 4 5 6) ; all operands are true values
6
scm> (and 4 5 (+ 3 3))
6
scm> (and #t #f 42 (/ 1 0)) ; short-circuiting behavior of and
#f
For the
and
andor
forms, remember to use our internal Python representations of#t
and#f
. See internal representations from Lab 11.
For or
, evaluate each sub-expression from left to right. If any sub-expression evaluates to a true value, return that value. Otherwise, return the value of the last sub-expression. If there are no sub-expressions in an or
expression, it evaluates to #f
.
scm> (or)
#f
scm> (or 5 2 1) ; 5 is a true value
5
scm> (or #f (- 1 1) 1) ; 0 is a true value in Scheme
0
scm> (or 4 #t (/ 1 0)) ; short-circuiting behavior of or
4
Important: Use the provided Python functions is_scheme_true
and is_scheme_false
from scheme_utils.py
to test boolean values.
Use Ok to unlock and test your code:
python ok -q 12 -u
python ok -q 12