Module: dfmc-environment-database Synopsis: DFM compiler database Author: Andy Armstrong, Chris Page, Roman Budzianowski 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 /// DFM compiler database define class () constant slot dfmc-database-proxy :: , required-init-keyword: proxy:; constant slot module-name-proxies :: = make(); end class ; define sealed method get-environment-object-primitive-name (server :: , object :: ) => (name :: ) "dfmc-database" end method get-environment-object-primitive-name; /// Context handling //---*** It would be nice to be able to have a real type for this! define constant = ; define sealed method browsing-context (server :: , source-form :: ) => (context :: ) let server-context = browsing-context(server, server); source-form-browsing-context(server-context, source-form) | context-missing-error(server, source-form) end method browsing-context; define sealed method browsing-context (server :: , project :: ) => (context :: ) ignore(server); project.project-browsing-context | context-missing-error(server, project) end method browsing-context; define sealed method browsing-context (server :: , database :: ) => (context :: ) assert(server == database, "Querying database %= using different database %=!", database, server); let project = server.dfmc-database-proxy; project.project-browsing-context | context-missing-error(server, project) end method browsing-context; define sealed method context-missing-error (server :: , project :: ) let name = project.project-library-name; error("No compilation context found for project '%s'", name-to-string(name)) end method context-missing-error; define sealed method context-missing-error (server :: , object :: ) error("No compilation context found for '%='", object) end method context-missing-error; /// Macroexpansion define method project-macroexpand-code (database :: , module :: , code :: , #key expansion-stream :: false-or() = #f, trace-stream :: false-or() = #f) => () let project = module-project-proxy(database, module); let module-name = module.compiler-object-proxy.module-definition-name; macroexpand-expression (project, module-name, code, expansion-stream: expansion-stream, trace-stream: trace-stream) end method project-macroexpand-code;