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 /// IDs define sealed abstract class () end class ; define sealed domain make (subclass()); define sealed domain initialize (); define sealed abstract class () end class ; define sealed abstract class () constant sealed slot id-name :: , required-init-keyword: name:; end class ; /// ID interning define constant $name-separator = ";"; define sealed generic id-table-and-key (class :: subclass(), #key, #all-keys) => (table :: , key :: ); define method make (class :: subclass(), #rest args, #key, #all-keys) => (id :: ) let (table, key) = apply(id-table-and-key, class, args); element(table, key, default: #f) | begin let id = next-method(); element(table, key) := id end end method make; define function make-id-cache () => (cache :: ) make(, weak: #"value") end function make-id-cache; /// Library IDs define sealed class () end class ; define constant $library-ids = make-id-cache(); define method id-table-and-key (class == , #key name :: ) => (table :: , key :: ) values($library-ids, name) end method id-table-and-key; /// Module IDs define sealed class () constant sealed slot id-library :: , required-init-keyword: library:; end class ; define constant $module-ids = make-id-cache(); define method id-table-and-key (class == , #key name :: , library :: ) => (table :: , key :: ) let library-name = id-name(library); let mangled-name = concatenate-as(, name, $name-separator, library-name); values($module-ids, mangled-name) end method id-table-and-key; /// Definition IDs define sealed class () constant sealed slot id-module :: , required-init-keyword: module:; end class ; define constant $definition-ids = make-id-cache(); define method id-table-and-key (class == , #key name :: , module :: ) => (table :: , key :: ) let module-name = id-name(module); let library-name = id-name(id-library(module)); let mangled-name = concatenate-as(, name, $name-separator, module-name, $name-separator, library-name); values($definition-ids, mangled-name) end method id-table-and-key; /// Method IDs define sealed class () constant sealed slot id-generic-function :: , required-init-keyword: generic-function:; constant sealed slot id-specializers :: , required-init-keyword: specializers:; end class ; define constant $method-ids = make-id-cache(); define method id-table-and-key (class == , #key generic-function :: , specializers :: ) => (table :: , key :: ) let (table, key) = id-table-and-key(, name: generic-function.id-name, module: generic-function.id-module); ignore(table); let mangled-name = key; for (specializer :: in specializers) let (table, key) = id-table-and-key(, name: specializer.id-name, module: specializer.id-module); ignore(table); mangled-name := concatenate-as(, mangled-name, $name-separator, key) end; values($method-ids, mangled-name) end method id-table-and-key; /// Object location IDs define sealed class () constant sealed slot id-filename :: , required-init-keyword: filename:; constant sealed slot id-line-number :: , required-init-keyword: line-number:; end class ; define constant $object-location-ids = make-id-cache(); define method id-table-and-key (class == , #key filename :: , line-number :: ) => (table :: , key :: ) let filename = as(, filename); let mangled-name = concatenate-as(, filename, $name-separator, integer-to-string(line-number)); values($object-location-ids, mangled-name) end method id-table-and-key; /// Library object location IDs define sealed class () constant sealed slot id-library :: , required-init-keyword: library:; end class ; define constant $library-object-location-ids = make-id-cache(); define method id-table-and-key (class == , #key filename :: , line-number :: , library :: ) => (table :: , key :: ) let filename = as(, filename); let library-name = library.id-name; let mangled-name = concatenate-as(, library-name, $name-separator, filename, $name-separator, integer-to-string(line-number)); values($library-object-location-ids, mangled-name) end method id-table-and-key;