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 /// Dylan objects /// /// Dylan objects don't seem to do much yet, but it seems like it should /// be useful for the environment to be able to work out if an object is /// part of the language (e.g. a class) or whether it is an abstraction /// provided by the environment (e.g. a project) define open abstract class () end class ; define open abstract class (, ) end class ; define open abstract class () end class ; define open abstract class (, ) end class ; /// Dylan IDs define constant $dylan-library-id = make(, name: "dylan"); define constant $dylan-module-id = make(, name: "dylan", library: $dylan-library-id); define constant $dylan-extensions-module-id = make(, name: "dylan-extensions", library: $dylan-library-id); define constant $dispatch-engine-module-id = make(, name: "dispatch-engine", library: $dylan-library-id); define constant $-id = make(, name: "", module: $dylan-module-id); define constant $-id = make(, name: "", module: $dylan-module-id); define constant $-id = make(, name: "", module: $dylan-module-id); define constant $-id = make(, name: "", module: $dylan-module-id); define constant $-id = make(, name: "", module: $dylan-module-id); /// Characters define class () end class ; /// Symbols define class () end class ; /// Booleans define class () constant slot boolean-object-true? :: , required-init-keyword: true?:; end class ; define constant $true-object = make(, true?: #t); define constant $false-object = make(, true?: #f); define method get-environment-object-primitive-name (project :: , boolean :: ) => (name :: ) if (boolean-object-true?(boolean)) "#t" else "#f" end end method get-environment-object-primitive-name; define method application-object-class (project :: , object :: ) => (class :: false-or()) make-environment-object(, project: project, id: $-id) end method application-object-class; /// Numbers define class () end class ; define class () end class ; define open generic number-object-to-string (server :: , number :: , #key prefix? :: , format :: false-or()) => (string :: false-or()); /// Collections define class (, ) end class ; define open generic collection-size (server :: , collection :: ) => (size :: false-or()); define open generic do-collection-keys (function :: , server :: , collection :: ) => (); define open generic do-collection-elements (function :: , server :: , collection :: ) => (); define open generic collection-keys (server :: , collection :: , #key range) => (keys :: false-or()); define open generic collection-elements (server :: , collection :: , #key range) => (elements :: false-or()); define class () end class ; define class () end class ; define class (, ) end class ; // Note: ranges are user objects, not internal objects, because // the "Contents" page is the only way to browse ranges. define class (, ) end class ; define class () end class ; define open generic range-start (server :: , range :: ) => (_start :: false-or()); define open generic range-end (server :: , range :: ) => (_end :: false-or()); define open generic range-by (server :: , range :: ) => (by :: false-or()); /// This only models non-proper lists, so it isn't a sequence object define class () end class ; define open generic pair-head (server :: , pair :: ) => (head :: false-or()); define open generic pair-tail (server :: , pair :: ) => (head :: false-or()); /// Project dispatching methods define method number-object-to-string (project :: , number :: , #key prefix? :: , format :: false-or() = #f) => (string :: false-or()) let server = choose-server(project, number, error?: #t); if (server) number-object-to-string(server, number, prefix?: prefix?, format: format) end end method number-object-to-string; define method collection-size (project :: , collection :: ) => (size :: false-or()) let server = choose-server(project, collection); server & collection-size(server, collection) end method collection-size; define method do-collection-keys (function :: , project :: , collection :: ) => () let server = choose-server(project, collection); server & do-collection-keys(function, server, collection) end method do-collection-keys; define method do-collection-elements (function :: , project :: , collection :: ) => () let server = choose-server(project, collection); server & do-collection-elements(function, server, collection) end method do-collection-elements; define method collection-keys (project :: , collection :: , #key range) => (keys :: false-or()) let server = choose-server(project, collection); server & collection-keys(server, collection, range: range) end method collection-keys; define method collection-elements (project :: , collection :: , #key range) => (elements :: false-or()) let server = choose-server(project, collection); server & collection-elements(server, collection, range: range) end method collection-elements; define method range-start (project :: , range :: ) => (_start :: false-or()) let server = choose-server(project, range); server & range-start(server, range) end method range-start; define method range-end (project :: , range :: ) => (_end :: false-or()) let server = choose-server(project, range); server & range-end(server, range) end method range-end; define method range-by (project :: , range :: ) => (by :: false-or()) let server = choose-server(project, range); server & range-by(server, range) end method range-by; define method pair-head (project :: , pair :: ) => (head :: false-or()) let server = choose-server(project, pair); server & pair-head(server, pair) end method pair-head; define method pair-tail (project :: , pair :: ) => (tail :: false-or()) let server = choose-server(project, pair); server & pair-tail(server, pair) end method pair-tail; /// Type names define method environment-object-type-name (object :: ) => (name :: ) "Number" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Integer" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Character" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "String" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Boolean" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Symbol" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Collection" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Pair" end method environment-object-type-name; define method environment-object-type-name (object :: ) => (name :: ) "Range" end method environment-object-type-name;