[1] Frames are not really a data abstraction in the following code: assign_name_value and define_variable use set_head to directly modify the values in a frame. The purpose of the frame functions is to make the environment-manipulation functions easy to read.
[2] The drawback of this representation (as well as the variant in exercise 4.4) is that the evaluator may have to search through many frames in order to find the binding for a given variable. (Such an approach is referred to as deep binding.) One way to avoid this inefficiency is to make use of a strategy called lexical addressing
4.1.3 Evaluator Data Structures