In the above discussion we have come across a problem related to the specializer's representation of functions and other partially static data (data with a static skeleton and dynamic components). In order to perform memoization, the specializer needs an external representation of them, for example as explicit closures. On the other hand, the use of eval and call/cc demands that the specializer uses the natural representation of the implementation. Also reflected functions and continuations should never handle dynamic data.
We capture these demands on the representation of functions by refinement of the function type. eval and call/cc are restricted to use only completely static functions. Such functions use the standard representation and do not touch dynamic data. On the other hand, there are memoizable functions which arise as arguments of sp-functions. They are represented as explicit closures. If these two requirements collide, the binding-time analysis defers the function to run time. The representation at run time does not matter for the specializer. In the presence of the above three alternatives we obtain a fourth one for free: functions that are not memoized can assume the standard representation, too.