74 Chapter V
pressions containing pointer variables are evaluated as
usual since pointer variables must be bound before the
? The implementation makes use of the similarity between constraints and instance methods. As discussed in the previous chapter where the word ?function? is used instead of ?instance method?, the major difference between constraints and instance methods is the way they are executed. A method call is executed at once while a constraint is asserted. The assertion stores the constraint in a constraint store without executing the constraint. The constraint is instead executed at solving time. As shown by the sequent rules in the previous chapter, the transformation of a userdefined constraint can be done exactly in the same steps as a user-defined method, which allows a user-defined constraint to be both defined and executed as an instance method. Since both primitive and user-defined constraints are implemented as instance methods, the execution model of the Smalltalk system can be used without significant change. Therefore, a quick (and clean) implementation can be done.
? To delay the execution of constraints in assertions, blocks or closures are used. Constraint assertions are implemented as instance methods of the class BlockClosure which represents compiled programs. The assertion methods simply store the blocks in constraint stores.
? A constraint that has been dynamically asserted is stored in the local constraint store of each of the objects connected to the constraint. A constraint statically asserted, i.e. whose duration is the same as the duration of the surrounding block, is stored in the execution context of the block. When the block has been completely executed, the constraint also disappears with the block.
? Solve- and propagate-methods are implemented in the way outlined in Chapter III. During constraint solving, the stored blocks are executed. Since both primitive and user-defined constraints are implemented as instance methods, the execution of the blocks leads to the execution of the instance methods. The result of the execution of the instance methods is a set of primitive constraints which are input to some primitive constraint solvers and solved by the primitive constraint solvers.