Module: environment-protocols Synopsis: Environment Protocols Author: Andy Armstrong 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 /// Source form objects define open abstract class (, , ) end class ; define open generic source-form-uses-definitions? (server :: , object :: , #key modules, libraries, client) => (uses-definitions? :: ); define open generic source-form-has-clients? (server :: , object :: , #key modules, libraries, client) => (has-clients? :: ); define open generic do-used-definitions (function :: , server :: , object :: , #key modules, libraries, client) => (); define open generic do-client-source-forms (function :: , server :: , object :: , #key modules, libraries, client) => (); /// Macro call objects define abstract class () end class ; define open generic do-macro-call-source-forms (function :: , server :: , object :: ) => (); /// Top level expression objects define class () end class ; define method environment-object-type-name (object :: ) => (label :: ) "Top level expression" end method environment-object-type-name; /// Macro call objects define class (, ) end class ; define method environment-object-type-name (object :: ) => (label :: ) "Macro call" end method environment-object-type-name; /// Project dispatching methods define method source-form-uses-definitions? (project :: , object :: , #key modules, libraries, client) => (uses-definitions? :: ) let database = ensure-database-server(project, object); database & source-form-uses-definitions? (database, object, modules: modules, libraries: libraries, client: client) end method source-form-uses-definitions?; define method source-form-has-clients? (project :: , object :: , #key modules, libraries, client) => (has-clients? :: ) let database = ensure-database-server(project, object); database & source-form-has-clients? (database, object, modules: modules, libraries: libraries, client: client) end method source-form-has-clients?; define method do-used-definitions (function :: , project :: , object :: , #key modules, libraries, client) => () let database = ensure-database-server(project, object); database & do-used-definitions(function, database, object, modules: modules, libraries: libraries, client: client) end method do-used-definitions; define method do-client-source-forms (function :: , project :: , object :: , #key modules, libraries, client) => () let database = ensure-database-server(project, object); database & do-client-source-forms(function, database, object, modules: modules, libraries: libraries, client: client) end method do-client-source-forms; define method do-macro-call-source-forms (function :: , project :: , object :: ) => () let database = ensure-database-server(project, object); database & do-macro-call-source-forms(function, database, object) end method do-macro-call-source-forms; /// Some convenience functions built on these protocols define function source-form-used-definitions (server :: , source-form :: , #key libraries, modules, client) => (used-definitions :: ) collect-environment-objects (do-used-definitions, server, source-form, libraries: libraries, modules: modules, client: client) end function source-form-used-definitions; define function source-form-clients (server :: , source-form :: , #key libraries, modules, client) => (clients :: ) collect-environment-objects (do-client-source-forms, server, source-form, libraries: libraries, modules: modules, client: client) end function source-form-clients; define function macro-call-source-forms (server :: , source-form :: ) => (source-forms :: ) collect-environment-objects(do-macro-call-source-forms, server, source-form) end function macro-call-source-forms;