Module: dfmc-macro-expander Synopsis: Classes describing template substitution operations. Author: Keith Playford 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 //// Template elements. // Template elements are either substitutions or just fragments. //// Substitutions. define abstract class () constant slot element-source-location = #f, init-keyword: source-location:; end class; define sealed domain make (subclass()); define sealed domain initialize (); define abstract class () slot element-variable-name, required-init-keyword: variable-name:; slot element-env-index :: = -1; end class; // Some substitutions are guaranteed to be non-empty, in particular // the substitutions involving name splicing or coercion. define abstract class () end; define abstract class () end; define abstract class (, ) end class; define abstract class (, ) end class; define class () end; define abstract class (, ) end class; define class () end; define class () end; // A splicing substitution encloses one of the above. define class () constant slot element-name-substitution, required-init-keyword: name-substitution:; constant slot element-prefix :: = "", init-keyword: prefix:; constant slot element-suffix :: = "", init-keyword: suffix:; end class; define class () constant slot element-separator, required-init-keyword: separator:; end class; define abstract class () constant slot element-template, required-init-keyword: template:; slot element-compiled-template; end class; define class () end; define class () constant slot element-rule-name, required-init-keyword: rule-name:; slot element-aux-rule-env :: ; slot element-aux-rule-index :: ; end class; //// Iteration. define method do-template-substitutions (f :: , seq :: ) => () for (elt in seq) do-template-substitutions(f, elt) end; end method; define method do-template-substitutions (f :: , elt :: ) => () // do nothing end method; define method do-template-substitutions (f :: , elt :: ) => () f(elt); end method; define method do-template-substitutions (f :: , elt :: ) => () do-template-substitutions(f, element-name-substitution(elt)); end method; define method do-template-substitutions (f :: , elt :: ) => () do-template-substitutions(f, fragment-nested-fragments(elt)); end method; // eof