Module: internal Author: Jonathan Bachrach 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 // BOOTED: define ... class ... end; define sealed inline method make (class == , #key code) => (character :: ); make(, code: code) end method make; define open generic as-uppercase (object :: ) => (result :: ); define open generic as-lowercase (object :: ) => (result :: ); define sealed inline method as (class == , integer :: ) => (result) as(, integer) end method as; define sealed inline method \= (character-1 :: , character-2 :: ) => (well? :: ) as(, character-1) = as(, character-2) end method \=; define sealed inline method \< (character-1 :: , character-2 :: ) => (well? :: ) as(, character-1) < as(, character-2) end method \<; define sealed method as-uppercase (character :: ) => (uppercase-character :: ) if (character.lowercase?) as(, as(, character) + (as(, 'A') - as(, 'a'))) else character end if end method as-uppercase; define sealed method as-lowercase-guts (character :: ) => (lowercase-character :: ) if (character.uppercase?) as(, as(, character) + (as(, 'a') - as(, 'A'))) else character end if end method as-lowercase-guts; define sealed method as-lowercase (character :: ) => (lowercase-character :: ) as-lowercase-guts(character); end method as-lowercase; ///// EXTRAS FROM COMMON LISP // TODO: OBSOLETE? /* define function alpha? (character :: ) => (result :: ) let code :: = as(, character); (code >= as(, 'a') & code <= as(, 'z')) | (code >= as(, 'A') & code <= as(, 'Z')) end function alpha?; */ define inline function lowercase? (character :: ) => (result :: ) let code :: = as(, character); code >= as(, 'a') & code <= as(, 'z') end function lowercase?; define inline function uppercase? (character :: ) => (result :: ) let code :: = as(, character); code >= as(, 'A') & code <= as(, 'Z') end function uppercase?; //// //// //// // BOOTED: define ... class ... end; // (code init-keyword: code: type: ) define macro character-definer { define character "<" ## ?:name ## "-character>" } => { define sealed inline method make (class == "<" ## ?name ## "-character>", #key code :: "<" ## ?name ## "-integer>") => (character :: "<" ## ?name ## "-character>") as("<" ## ?name ## "-character>", code) end method make; define sealed inline method as (class == , character :: "<" ## ?name ## "-character>") => (code :: "<" ## ?name ## "-integer>"); as(, character) end method as; define sealed inline method as (type :: , character :: "<" ## ?name ## "-character>") => (code :: "<" ## ?name ## "-integer>"); as(, character) end method as; define sealed inline method as (class == , character :: "<" ## ?name ## "-character>") // => (code :: "<" ## ?name ## "-integer>"); // let code :: "<" ## ?name ## "-integer>" // = raw-as-integer("primitive-" ## ?name ## "-character-as-raw"(character)); // code => (code :: ) raw-as-integer("primitive-" ## ?name ## "-character-as-raw"(character)) end method as; define sealed inline method as (class == "<" ## ?name ## "-character>", // integer :: "<" ## ?name ## "-integer>") integer :: ) => (result :: "<" ## ?name ## "-character>") // (element *byte-characters* integer) "primitive-raw-as-" ## ?name ## "-character"(integer-as-raw(integer)) end method as; } end macro; define constant = ; define character ; define constant $number-ascii-characters = 256; define constant $lowercase-ascii :: = make(, size: $number-ascii-characters); for (i from 0 below size($lowercase-ascii)) let c = as(, i); $lowercase-ascii[i] := as-lowercase-guts(c); end for; /// THIS NEEDS TO BE FAST FOR SYMBOLS ETC define sealed inline method as-lowercase (character :: ) => (lowercase-character :: ) // without-bounds-checks element-no-bounds-check($lowercase-ascii, as(, character)) // end without-bounds-checks; end method as-lowercase; // ALREADY BOOTED // (define *byte-characters* (make size: 256)) /// INITIALIZE *BYTE-CHARACTERS* // (for ((index from 0 below 256)) // (set! (element *byte-characters* index) (as index))) // eof