Module: dfmc-back-end Author: Jonathan Bachrach, Keith Playford, and Paul Haahr Synopsis: utilities for labeling nodes in prepartion for emission 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 // accessors define method label? (c :: ) c.%label end method; define method label (c :: ) let label = c.%label; unless (label) error("%=: unlabeled state", c); end unless; label end method; /* TODO: OBSOLETE? define method clear-label! (c :: ) c.%label := #f end method; */ // labeling define class () slot next-label, init-value: 0; end class ; define method new-label! (state :: ) block () state.next-label afterwards state.next-label := state.next-label + 1 end block; end method; define method maybe-label-with-state! (c :: , state :: ) c.%label | set-label!(c, state) end method; define method set-label! (c :: , state :: ) c.%label := new-label!(state) end method; define thread variable *init-labeling-state* = #f; define macro with-labeling-from-dynamic { with-labeling-from-dynamic ?:body end } => { dynamic-bind (*init-labeling-state* = make()) ?body end dynamic-bind } end macro; define method maybe-label! (c :: ) maybe-label-with-state!(c, *init-labeling-state*) end method; // TODO: RIP OUT USES define method label! (o :: <&iep>) => () end method label!; define method label! (o :: <&lambda>) => () label!(o.iep) end method label!;