Annotation of researchv10no/cmd/sml/src/basics/basics.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: (* basics.sml *)
        !             3: 
        !             4: (* basic datatypes *)
        !             5: 
        !             6: structure Basics : BASICS = struct
        !             7: 
        !             8:   structure Symbol = Symbol
        !             9:   structure Access = Access
        !            10:   structure IntStrMap = IntStrMap
        !            11:   structure Stampset = Stampset
        !            12: 
        !            13:   open Symbol Access PrintUtil
        !            14: 
        !            15:     type spath = symbol list
        !            16:     type label = symbol
        !            17:     type stamp = int
        !            18:     type polysign = {weakness: int, eq: bool} list
        !            19:     type sharespec = {s: (spath*spath) list,
        !            20:                      t: (spath*spath) list}
        !            21: 
        !            22:     datatype bool3 = YES | NO | MAYBE
        !            23: 
        !            24:   (* fixity attributes *)
        !            25: 
        !            26:     datatype fixity = NONfix | INfix of (int*int)
        !            27: 
        !            28:     datatype conrep
        !            29:       = UNDECIDED 
        !            30:       | TAGGED of int 
        !            31:       | CONSTANT of int 
        !            32:       | TRANSPARENT 
        !            33:       | TRANSU
        !            34:       | TRANSB
        !            35:       | REF
        !            36:       | VARIABLE of access (* exception constructor *)
        !            37: 
        !            38:     val infinity = 10000000
        !            39: 
        !            40:     datatype tvkind
        !            41:       = IBOUND of int   (* inferred bound type variables -- indexed *)
        !            42:       | META of                 (* metavariables -- depth = infinity for metaargs *)
        !            43:          {depth: int,
        !            44:           weakness: int,
        !            45:           eq: bool}
        !            46:       | INSTANTIATED of ty
        !            47:       | UBOUND of  (* user bound type variables -- user name*)
        !            48:          {name: symbol,
        !            49:           weakness: int,
        !            50:           eq: bool}
        !            51: 
        !            52:     and datacon  (* exceptions are a special case with rep=VARIABLE() *)
        !            53:       = DATACON of
        !            54:          {name  : symbol,
        !            55:           const : bool,
        !            56:           typ   : ty ref,
        !            57:           rep   : conrep,
        !            58:           sign  : conrep list}
        !            59: 
        !            60:     and tyckind
        !            61:       = ABStyc (* atomic and abstract types *)
        !            62:       | DEFtyc of tyfun
        !            63:       | DATAtyc of datacon list
        !            64:       | RECORDtyc of label list
        !            65:       | UNDEFtyc of symbol list option
        !            66: 
        !            67:     and tycon
        !            68:       = TYCON of
        !            69:          {stamp : stamp,
        !            70:           arity : int,
        !            71:           eq    : bool3 ref,
        !            72:           path  : symbol list,
        !            73:           kind  : tyckind}
        !            74:       | INDtyc of int   (* indirect tycon -- only in bindings (in sigs) *)
        !            75:       | SHRtyc of int list   (* sharing indirection -- probably not used *)
        !            76:       | RELtyc of int list   (* relative tycon -- only in type expressions *)
        !            77:       | NULLtyc
        !            78: 
        !            79:     and ty 
        !            80:       = VARty of tyvar
        !            81:       | CONty of tycon ref * ty list
        !            82:       | FLEXRECORDty of rowty ref
        !            83:       | POLYty of {sign: {weakness:int, eq:bool} list, tyfun: tyfun}
        !            84:       | UNDEFty
        !            85:       | ERRORty
        !            86: 
        !            87:     and rowty
        !            88:       = OPEN of (label * ty) list
        !            89:       | CLOSED of ty
        !            90: 
        !            91:     and tyfun
        !            92:       = TYFUN of
        !            93:          {arity : int,
        !            94:           body : ty}
        !            95: 
        !            96: 
        !            97:   (* variables *)
        !            98: 
        !            99:     and var
        !           100:       = VALvar of                    (* ordinary variables *)
        !           101:          {access: access,
        !           102:           name : symbol list,
        !           103:           typ : ty ref}
        !           104:       | OVLDvar of                   (* overloaded identifier *)
        !           105:          {name : symbol,
        !           106:           options: {indicator: ty, variant: var} list ref,
        !           107:           scheme: tyfun}
        !           108:       | UNKNOWNvar of symbol      (* place holder for backpatching *)
        !           109: 
        !           110: 
        !           111:   (* structures and signatures *)
        !           112: 
        !           113:     and strenv 
        !           114:       =        DIR
        !           115:       | REL of {s: Structure array, t: tycon array}
        !           116: 
        !           117:     and strkind
        !           118:       = STRkind of
        !           119:           {path : symbol list}
        !           120:       | SIGkind of
        !           121:          {share: sharespec,
        !           122:           bindings : binding list,
        !           123:           stamps : Stampset.stampsets}
        !           124: 
        !           125:     and Structure
        !           126:       = STRstr of
        !           127:          {stamp : stamp,
        !           128:           sign  : stamp,
        !           129:           table : symtable,
        !           130:           env   : strenv,
        !           131:           kind  : strkind}
        !           132:       | INDstr of int        (* indirect substructure binding *)
        !           133:       | SHRstr of int list   (* sharing indirection *)
        !           134:       | NULLstr
        !           135: 
        !           136:     and Functor
        !           137:       = FUNCTOR of
        !           138:          {paramName: symbol,
        !           139:           param: Structure,
        !           140:           body: Structure,
        !           141:           paramVis: bool,
        !           142:           stamps: Stampset.stampsets}
        !           143: 
        !           144:     and signatureVar
        !           145:       = SIGvar of
        !           146:          {name: symbol,
        !           147:           binding: Structure}
        !           148: 
        !           149:     and structureVar
        !           150:       = STRvar of
        !           151:          {name: symbol list,
        !           152:           access: access,         
        !           153:           binding: Structure}
        !           154: 
        !           155:     and functorVar
        !           156:       = FCTvar of
        !           157:          {name: symbol,
        !           158:           access: access,         
        !           159:           binding: Functor}
        !           160: 
        !           161:     and fixityVar
        !           162:       = FIXvar of
        !           163:          {name: symbol,
        !           164:           binding: fixity}
        !           165: 
        !           166:     and binding 
        !           167:       = VARbind of var  
        !           168:       | CONbind of datacon
        !           169:       | TYCbind of tycon ref (* patchable *)
        !           170:       | TYVbind of tyvar
        !           171:       | SIGbind of signatureVar
        !           172:       | STRbind of structureVar
        !           173:       | FCTbind of functorVar
        !           174:       | FIXbind of fixityVar
        !           175: 
        !           176:     (* Note: exceptions are identified with data constructors; they
        !           177:        no longer have a separate name space, hence no EXNbind constructor.
        !           178:        On the other hand, structures and functors have separate name spaces,
        !           179:        which may not be correct. *)
        !           180: 
        !           181:     withtype tyvar = tvkind ref
        !           182:     and binder = int * string * binding
        !           183:     and symtable = binding IntStrMap.intstrmap
        !           184: 
        !           185:     datatype trans
        !           186:       = VALtrans of access     (* old position, val, exn, or unthinned str *)
        !           187:       | THINtrans of access * lvar * trans list
        !           188:            (* old str position, substr thinning *)
        !           189:       | CONtrans of datacon            (* constructor as value component *)
        !           190: 
        !           191:     type thinning = (lvar * trans list) option
        !           192: 
        !           193: 
        !           194:   (* building fixities *)
        !           195: 
        !           196:     fun infixleft n = INfix (n+n, n+n)
        !           197:     fun infixright n = INfix (n+n+1, n+n)
        !           198: 
        !           199: 
        !           200:   (* building variables *)
        !           201: 
        !           202:     fun mkVALvar(id: symbol, refty: ty ref) : var =
        !           203:        VALvar{access = LVAR(namedLvar(id)), name = [id], typ = refty}
        !           204: 
        !           205: 
        !           206:   (* building tycons, signatures, structures, and functors *)
        !           207: 
        !           208:     fun mkTyvar(kind: tvkind) : tyvar = ref kind
        !           209:     
        !           210:     fun mkABStyc(path: symbol list, arity: int, eq: bool3,
        !           211:                 {tycStamps,...}: Stampset.stampsets)
        !           212:         : tycon =
        !           213:        TYCON{stamp = Stampset.newStamp(tycStamps), path = path, arity = arity,
        !           214:              eq = ref eq, kind = ABStyc}
        !           215:     
        !           216:     fun mkDEFtyc(path: symbol list, def as TYFUN{arity,...}: tyfun, eq: bool3,
        !           217:                 {tycStamps,...}: Stampset.stampsets)
        !           218:         : tycon =
        !           219:        TYCON{stamp = Stampset.newStamp(tycStamps), path = path,
        !           220:              arity = arity, eq = ref eq, kind = DEFtyc def}
        !           221:     
        !           222:     fun mkDATAtyc(path: symbol list, arity: int, dcons: datacon list, eq: bool3,
        !           223:                 {tycStamps,...}: Stampset.stampsets)
        !           224:         : tycon =
        !           225:        TYCON{stamp = Stampset.newStamp(tycStamps), path = path,
        !           226:              arity = arity, eq = ref eq, kind = DATAtyc dcons}
        !           227:     
        !           228:     fun mkUNDEFtyc(name: symbol, arity: int) : tycon =
        !           229:        TYCON{stamp = ~1, path = [name], arity = arity, eq = ref MAYBE,
        !           230:              kind = UNDEFtyc NONE}
        !           231: 
        !           232:     fun mkSTR(path, table, env, {strStamps,...}: Stampset.stampsets) = 
        !           233:         STRstr{stamp = Stampset.newStamp(strStamps),
        !           234:                sign = 0,  (* guaranteed not to agree with any valid sig stamp *)
        !           235:               table = table,
        !           236:               env = env,
        !           237:               kind = STRkind{path=path}}
        !           238: 
        !           239: end (* structure Basics *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.