I may be faster than Scheme II and vice versa. When a program makes an allocation request, it searches the list for a memory block the right size. If the block is larger than what the program requested, it breaks up the block, returns one part to the program and puts the other part on the free list. When a program deallocates a variable, it puts the space for that variable on the free list. This is very similar to how UNIX does it.
All free space is contiguous.
When a program makes an allocation request, the memory manager breaks off a part of the free space and returns it to the user program. After the call to partition, lt contains all the entries in l that were smaller than the pivot and gt all the entries in l that were greater than the pivot. Assume that you have two accurate copying garbage collectors, one that uses liveness information and one that doesn't use liveness information. Assume that the list being sorted does not have any duplicates. For each of the three principles of orthogonal persistence, explain the problems that would occur if you compromised the principles.