Figure 1.2 Functional decomposition of the sqrt program.

[1] It is not even clear which of these functions is a more efficient implementation. This depends upon the hardware available. There are machines for which the obvious implementation is the less efficient one. Consider a machine that has extensive tables of logarithms and antilogarithms stored in a very efficient manner.
[2] The concept of consistent renaming is actually subtle and difficult to define formally. Famous logicians have made embarrassing errors here.
[3] Lexical scoping dictates that free names in a function are taken to refer to bindings made by enclosing function declarations; that is, they are looked up in the environment in which the function was declared. We will see how this works in detail in chapter 3 when we study environments and the detailed behavior of the interpreter.
[4] Embedded declarations must come first in a function body. The management is not responsible for the consequences of running programs that intertwine declaration and use.
1.1.8 Functions as Black-Box Abstractions