MACLISP, unlike some other implementations of LISP, allocates storage for different types of objects in noncontiguous areas called "spaces". These spaces partition the active storage into disjoint areas, each of which holds a different type of object. For example, "list cells" are stored in one space, "full-word integers" reside in another space, "full-word floating point numbers" in another, and so on. Allocating space in this manner has several advantages. An object's type can easily be computed from a pointer to it, without any memory references to the object itself. Thus, the LISP primitive ATOM(x) can easily compute its result without even paging in x. Another advantage is that the type of an object does not require any storage within the object, so that arithmetic with hardware data types such as full-word integers can use hardware instructions directly. There are problems associated with this method of storage and type management, however. When all data types are allocated from the same heap, there is no problem with varying demand for the different data types; all data types require storage from the same pool, so that only the total amount of storage is important. Once different data types must be allocated from different spaces, however, the relative sizes of the spaces becomes important.