module: walker 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 constant = ; define constant = limited(, of: ); define constant = limited(, of: ); define inline function walker-slot-value (object, slot-descriptor :: ) => (value) initialized-slot-element(object, slot-descriptor) end function; define inline function walker-slot-value-setter (new-value, object, slot-descriptor :: ) slot-element(object, slot-descriptor) := new-value; end function; define inline function as-walker-slot-descriptor (class :: , slot-descriptor :: ) => (walker-slot-descriptor :: ) slot-offset(slot-descriptor, class) end function; /* define inline function walker-slot-value (object, slot-descriptor) slot-value(object, slot-descriptor) end function; define inline function walker-slot-value-setter (new-value, object, slot-descriptor) slot-value(object, slot-descriptor) := new-value; end function; define inline function as-walker-slot-descriptor (class :: , slot-descriptor :: ) slot-descriptor end function; */ define open generic walker-shallow-getters (walker :: , class :: ) => (res :: ); define method walker-shallow-getters (walker :: , class :: ) => (res :: ) #() end method; define class () constant slot walker-default-slot-descriptor :: , required-init-keyword: slot-descriptor:; constant slot walker-default-thunk :: , required-init-keyword: thunk:; end class; define function make-walker-defaulted-descriptor (slot-descriptor :: , thunk :: ) make(, slot-descriptor: slot-descriptor, thunk: thunk); end function; define constant = ; define inline function walker-defaulted-getter? (spec) instance?(spec, ) end function; define inline method walker-default-getter (spec :: ) head(spec) end method; define inline method walker-default-thunk (spec :: ) tail(spec) end method; define constant = limited(, of: ); define function walker-defaulted-shallow-getters (walker :: , class :: ) => (res :: ) choose(walker-defaulted-getter?, walker-shallow-getters(walker, class)) end function; define constant $walker-simple = #"simple"; define constant $walker-complex = #"complex"; define constant $walker-repeated = #"repeated"; define class () constant slot walker-class-repeated-slot? :: , required-init-keyword: repeated-slot?:; constant slot walker-class-deep-slot-descriptors :: , required-init-keyword: deep-slot-descriptors:; constant slot walker-class-shallow-slot-descriptors :: , required-init-keyword: shallow-slot-descriptors:; constant slot walker-class-defaulted-slot-descriptors :: , required-init-keyword: defaulted-slot-descriptors:; slot walker-class-kind :: = #"default"; end class; define method initialize (class :: , #key) => () next-method(); let kind = case walker-class-repeated-slot?(class) => $walker-repeated; empty?(walker-class-shallow-slot-descriptors(class)) & empty?(walker-class-defaulted-slot-descriptors(class)) => $walker-simple; otherwise => $walker-complex; end case; walker-class-kind(class) := kind; end method; define function walker-real-shallow-getters (walker :: , class :: ) => (res :: ) choose(complement(walker-defaulted-getter?), walker-shallow-getters(walker, class)) end function; define method walker-compute-defaulted-slot-descriptors (walker :: , class :: ) => (res :: ) let shallow-getters = walker-defaulted-shallow-getters(walker, class); collecting (as ) for (sd in walker-slot-descriptors(class)) for (shallow-getter in shallow-getters) if (slot-getter(sd) == walker-default-getter(shallow-getter)) collect(make-walker-defaulted-descriptor (as-walker-slot-descriptor(class, sd), walker-default-thunk(shallow-getter))) end if; end for; end for; end collecting; end method; define method walker-compute-shallow-slot-descriptors (walker :: , class :: ) => (res :: ) let shallow-getters = walker-real-shallow-getters(walker, class); map-as(, curry(as-walker-slot-descriptor, class), choose(method (sd) member?(sd.slot-getter, shallow-getters) end, walker-slot-descriptors(class))) end method; define method walker-compute-deep-slot-descriptors (walker :: , class :: ) => (res :: ) let defaulted-getters = walker-defaulted-shallow-getters(walker, class); let shallow-getters = walker-real-shallow-getters(walker, class); map-as(, curry(as-walker-slot-descriptor, class), if (empty?(defaulted-getters) & empty?(shallow-getters)) walker-slot-descriptors(class) else choose(method (sd) ~member?(sd.slot-getter, map(walker-default-getter, defaulted-getters)) & ~member?(sd.slot-getter, shallow-getters) end method, walker-slot-descriptors(class)) end) end method; define function walker-class (walker :: , class :: ) => (res :: ) element(walker-classes(walker), class, default: #f) | (element(walker-classes(walker), class) := make(, repeated-slot?: walker-repeated-slot?(class), shallow-slot-descriptors: walker-compute-shallow-slot-descriptors(walker, class), defaulted-slot-descriptors: walker-compute-defaulted-slot-descriptors(walker, class), deep-slot-descriptors: walker-compute-deep-slot-descriptors(walker, class))); end function; /* define function walker-all-slot-descriptors (walker :: , class :: ) => (shallow-slotds :: , defaulted-slotds :: , deep-slotds :: ) let walker-class = walker-class(walker, class); values(walker-class-shallow-slot-descriptors(walker-class), walker-class-defaulted-slot-descriptors(walker-class), walker-class-deep-slot-descriptors(walker-class)) end function; */ define inline function walker-slot-descriptors-of (walker :: , class :: , access :: ) => (res) access(walker-class(walker, class)) end function; define function walker-shallow-slot-descriptors (walker :: , class :: ) => (res :: ) walker-slot-descriptors-of (walker, class, walker-class-shallow-slot-descriptors) end function; define function walker-defaulted-slot-descriptors (walker :: , class :: ) => (res :: ) walker-slot-descriptors-of (walker, class, walker-class-defaulted-slot-descriptors) end function; define function walker-deep-slot-descriptors (walker :: , class :: ) => (res :: ) walker-slot-descriptors-of (walker, class, walker-class-deep-slot-descriptors) end function; // eof