Problem 14 (200pts): local binding with let
The let
special form (spec) binds symbols to values locally, giving them their initial values. For example:
scm> (define x 5)
x
scm> (define y 'bye)
y
scm> (let ((x 42)
(y (* x 10))) ; this x refers to the global value of x, not 42
(list x y))
(42 50)
scm> (list x y)
(5 bye)
Implement make_let_frame
in scheme_forms.py
, which returns a child frame of env
that binds the symbol in each element of bindings
to the value of its corresponding expression. The bindings
Scheme list contains pairs that each contain a symbol and a corresponding expression.
You may find the following functions and methods useful:
validate_form
: this function can be used to validate the structure of each binding. It takes in a Scheme listexpr
of expressions and amin
andmax
length. Ifexpr
is not a list with length betweenmin
andmax
inclusive, it raises an error. If nomax
is passed in, the default is infinity.validate_formals
: this function validates that its argument is a Scheme list of symbols for which each symbol is distinct.
Remember to refer to the spec if you don't understand any of the test cases!
Use Ok to unlock and test your code:
python ok -q 14 -u
python ok -q 14