module: walker
author: jonathan bachrach
Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
All rights reserved.
License: Functional Objects Library Public License Version 1.0
Dual-license: GNU Lesser General Public License
Warranty: Distributed WITHOUT WARRANTY OF ANY KIND
define method remove-all-keys! (table ::
)
do (curry(remove-key!, table), key-sequence(table));
table;
end method;
define method walker-repeated-slot? (class :: subclass())
#t
end method;
define constant initialized-slot-element = slot-element;
/// BOOLEAN
define method walker-compute-deep-slot-descriptors
(walker :: , class == )
#()
end method;
define method walker-compute-lazy-slot-descriptors
(walker :: , class == )
#()
end method;
define method walker-compute-weak-slot-descriptors
(walker :: , class == )
#()
end method;
/// LIST
define method walker-compute-deep-slot-descriptors
(walker :: , class :: subclass())
vector(0, 1)
end method;
define method do-deep-copy
(copier :: , object :: ) => (value)
let size = size(object);
let copy = make(, size: size);
copier-register-copied(copier, object, copy);
let entries = tail(object.table-values);
for (val/key/back in entries)
let key = head(tail(val/key/back));
let value = head(val/key/back);
copy[deep-copy(copier, key)] := deep-copy(copier, value);
end for;
copy
end method;
define method do-deep-walk
(walker :: , function :: ,
parent, object :: )
walker-register-walked(walker, parent, object, object);
let entries = tail(object.table-values);
for (val/key/back in entries)
deep-walk(walker, function, object, head(tail(val/key/back)));
deep-walk(walker, function, object, head(val/key/back));
end for;
end method;
define method walker-instance-size (element :: )
next-method() + size(element) * 2 // lower bound
end method;
define method do-deep-walk
(walker :: , function :: ,
parent, object :: )
do(curry(deep-walk, walker, function, parent), object)
end method;
define method walker-allocate-object (class :: subclass(), size)
make(class, size: size)
end method;
define method walker-allocate-object (class == , size)
make()
end method;
define method walker-allocate-object (class :: subclass(), size)
pair(#f, #f)
end method;
define method walker-allocate-object (class :: , size)
allocate(class, size: size)
end method;
define function walker-allocate-simple-object (class)
walker-allocate-object(class, 0);
end function;
define constant walker-allocate-repeated-object = walker-allocate-object;
// eof