Module: environment-protocols Synopsis: Environment protocols Author: Andy Armstrong, Chris Page 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 /// Function objects define abstract class () end class ; //--- Ideally this would be abstract, but //--- is concrete... define class (, , , ) end class ; define class () end class ; define class () end class ; define class () end class ; define class () end class ; define class () end class ; define class (, ) end class ; define class () constant slot parameter-name :: , required-init-keyword: name:; constant slot parameter-type :: , required-init-keyword: type:; end class ; define class () constant slot parameter-keyword :: false-or() = #f, init-keyword: keyword:; constant slot parameter-default-value :: , required-init-keyword: default-value:; end class ; /// Protocols // Should probably be limited collections define constant = ; define constant = ; define open generic function-parameters (server :: , function :: ) => (required :: , rest :: false-or(), keys :: , all-keys? :: , next :: false-or(), values :: , rest-value :: false-or()); define open generic do-generic-function-methods (function :: , server :: , generic-function :: , #key client) => (); define open generic method-specializers (server :: , object :: ) => (specializers :: ); define open generic method-generic-function (server :: , object :: ) => (function :: false-or()); /// Project dispatching methods define method function-parameters (project :: , function :: ) => (required :: , rest :: false-or(), keys :: , all-keys? :: , next :: false-or(), values :: , rest-value :: false-or()) let server = choose-server(project, function, error?: #t); function-parameters(server, function) end method function-parameters; define method do-generic-function-methods (function :: , project :: , generic-function :: , #key client) => () let server = choose-server(project, generic-function); server & do-generic-function-methods(function, server, generic-function, client: client) end method do-generic-function-methods; define method method-specializers (project :: , function :: ) => (specializers :: ) let server = choose-server(project, function, error?: #t); method-specializers(server, function) end method method-specializers; define method method-generic-function (project :: , function :: ) => (function :: false-or()) let server = choose-server(project, function); server & method-generic-function(server, function) end method method-generic-function; /// Function names define method environment-object-type-name (object :: ) => (label :: ) "Generic" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (label :: ) "Method" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (label :: ) "Function" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (label :: ) "Foreign function" end method environment-object-type-name; /// Convenience functions define function generic-function-object-methods (server :: , function :: ) => (methods :: ) collect-environment-objects(do-generic-function-methods, server, function) end function generic-function-object-methods;