The let Construction: - See DEMO. The function repeat_square_1 takes roughly 2^i steps (as opposed to i) since it computes the same thing twice on each iteration. - The let construction allows you to store a value in a particular variable for the use in another calculation. The syntax is (let ( (name_1 value_1) . . . (name_n value_n) ) (expression using name_i) ) where the name_i are locally assigned the value_i for use in the expression. See DEMO for the let construction used in the repeat_square example. - If you want to use name_i in value_k for k > i, then use 'let*' instead of 'let'. 'let*' is equivalent to nested 'let's, i.e. (let ( (name_1 value_1) ) (let ( (name_2 (f(name_1))) ) (...) ) is equivalent to (let* ( (name_1 value_1) (name_2 f(value_2)) ) (...) ) See the DEMO for an illustration of this. Parsing: - See Assignment 3 for information Local Definitions: - Local definitions are function definitions within functions (e.g. parse_formula on Asst 3). They are useful for organizational purposes, typically when a function is only relevant for use within another.