Annotation of 43BSD/contrib/B/src/bint/b2tcP.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:   $Header: b2tcP.c,v 1.4 85/08/22 16:57:02 timo Exp $
                      5: */
                      6: 
                      7: /* polytype representation */
                      8: 
                      9: #include "b.h"
                     10: #include "b1obj.h"
                     11: #include "b2tcP.h"
                     12: 
                     13: /* A polytype is a compound with two fields.
                     14:  * The first field is a B text, and holds the typekind.
                     15:  * If the typekind is 'Variable', the second field is 
                     16:  *   a B text, holding the identifier of the variable;
                     17:  * otherwise, the second field is a compound of sub(poly)types,
                     18:  *   indexed from 0 to one less then the number of subtypes.
                     19:  */
                     20: 
                     21: #define Kin    0
                     22: #define Sub    1
                     23: #define Id     Sub
                     24: #define Asc    0
                     25: #define Key    1
                     26: 
                     27: #define Kind(u)                ((typekind) *Field((value) (u), Kin))
                     28: #define Psubtypes(u)   (Field((value) (u), Sub))
                     29: #define Ident(u)       (*Field((value) (u), Id))
                     30: 
                     31: typekind var_kind;
                     32: typekind num_kind;
                     33: typekind tex_kind;
                     34: typekind lis_kind;
                     35: typekind tab_kind;
                     36: typekind com_kind;
                     37: typekind t_n_kind;
                     38: typekind l_t_kind;
                     39: typekind tlt_kind;
                     40: typekind err_kind;
                     41: 
                     42: polytype num_type;
                     43: polytype tex_type;
                     44: polytype err_type;
                     45: polytype t_n_type;
                     46: 
                     47: /* Making, setting and accessing (the fields of) polytypes */
                     48: 
                     49: Visible polytype mkt_polytype(k, nsub) typekind k; intlet nsub; {
                     50:        value u;
                     51:        
                     52:        u = mk_compound(2);
                     53:        *Field(u, Kin)= copy((value) k);
                     54:        *Field(u, Sub)= mk_compound(nsub);
                     55:        return ((polytype) u);
                     56: }
                     57: 
                     58: Procedure putsubtype(sub, u, isub) polytype sub, u; intlet isub; {
                     59:        *Field(*Psubtypes(u), isub)= (value) sub;
                     60: }
                     61: 
                     62: typekind kind(u) polytype u; {
                     63:        return (Kind(u));
                     64: }
                     65: 
                     66: intlet nsubtypes(u) polytype u; {
                     67:        return (Nfields(*Psubtypes(u)));
                     68: }
                     69: 
                     70: polytype subtype(u, i) polytype u; intlet i; {
                     71:        return ((polytype) *Field(*Psubtypes(u), i));
                     72: }
                     73: 
                     74: polytype asctype(u) polytype u; {
                     75:        return (subtype(u, Asc));
                     76: }
                     77: 
                     78: polytype keytype(u) polytype u; {
                     79:        return (subtype(u, Key));
                     80: }
                     81: 
                     82: value ident(u) polytype u; {
                     83:        return (Ident(u));
                     84: }
                     85: 
                     86: /* making new polytypes */
                     87: 
                     88: polytype mkt_number() {
                     89:        return(p_copy(num_type));
                     90: }
                     91: 
                     92: polytype mkt_text() {
                     93:        return(p_copy(tex_type));
                     94: }
                     95: 
                     96: polytype mkt_tn() {
                     97:        return(p_copy(t_n_type));
                     98: }
                     99: 
                    100: polytype mkt_error() {
                    101:        return(p_copy(err_type));
                    102: }
                    103: 
                    104: polytype mkt_list(s) polytype s; {
                    105:        polytype u;
                    106:        
                    107:        u = mkt_polytype(lis_kind, 1);
                    108:        putsubtype(s, u, Asc);
                    109:        return (u);
                    110: }
                    111: 
                    112: polytype mkt_table(k, a) polytype k, a; {
                    113:        polytype u;
                    114:        
                    115:        u = mkt_polytype(tab_kind, 2);
                    116:        putsubtype(a, u, Asc);
                    117:        putsubtype(k, u, Key);
                    118:        return (u);
                    119: }
                    120: 
                    121: polytype mkt_lt(s) polytype s; {
                    122:        polytype u;
                    123:        
                    124:        u = mkt_polytype(l_t_kind, 1);
                    125:        putsubtype(s, u, Asc);
                    126:        return (u);
                    127: }
                    128: 
                    129: polytype mkt_tlt(s) polytype s; {
                    130:        polytype u;
                    131:        
                    132:        u = mkt_polytype(tlt_kind, 1);
                    133:        putsubtype(s, u, Asc);
                    134:        return (u);
                    135: }
                    136: 
                    137: polytype mkt_compound(nsub) intlet nsub; {
                    138:        return mkt_polytype(com_kind, nsub);
                    139: }
                    140: 
                    141: polytype mkt_var(id) value id; {
                    142:        polytype u;
                    143:        
                    144:        u = mk_compound(2);
                    145:        *Field(u, Kin)= copy((value) var_kind);
                    146:        *Field(u, Id)= id;
                    147:        return (u);
                    148: }
                    149: 
                    150: Hidden value nnewvar;
                    151: 
                    152: polytype mkt_newvar() {
                    153:        value v;
                    154:        v = sum(nnewvar, one);
                    155:        release(nnewvar);
                    156:        nnewvar = v;
                    157:        return mkt_var(convert(nnewvar, No, No));
                    158: }
                    159: 
                    160: polytype p_copy(u) polytype u; {
                    161:        return((polytype) copy((polytype) u));
                    162: }
                    163: 
                    164: Procedure p_release(u) polytype u; {
                    165:        release((polytype) u);
                    166: }
                    167: 
                    168: /* predicates */
                    169: 
                    170: bool are_same_types(u, v) polytype u, v; {
                    171:        if (compare((value) Kind(u), (value) Kind(v)) NE 0)
                    172:                return (No);
                    173:        else if (t_is_var(Kind(u)))
                    174:                return (compare(Ident(u), Ident(v)) EQ 0);
                    175:        else
                    176:                return (
                    177:                        (nsubtypes(u) EQ nsubtypes(v))
                    178:                        &&
                    179:                        (compare(*Psubtypes(u), *Psubtypes(v)) EQ 0)
                    180:                );
                    181: }
                    182: 
                    183: bool have_same_structure(u, v) polytype u, v; {
                    184:        return(
                    185:                (compare((value) Kind(u), (value) Kind(v)) EQ 0)
                    186:                &&
                    187:                nsubtypes(u) EQ nsubtypes(v)
                    188:        );
                    189: }
                    190: 
                    191: bool t_is_number(kind) typekind kind; {
                    192:        return (compare((value) kind, (value) num_kind) EQ 0 ? Yes : No);
                    193: }
                    194: 
                    195: bool t_is_text(kind) typekind kind; {
                    196:        return (compare((value) kind, (value) tex_kind) EQ 0 ? Yes : No);
                    197: }
                    198: 
                    199: bool t_is_tn(kind) typekind kind; {
                    200:        return (compare((value) kind, (value) t_n_kind) EQ 0 ? Yes : No);
                    201: }
                    202: 
                    203: bool t_is_error(kind) typekind kind; {
                    204:        return (compare((value) kind, (value) err_kind) EQ 0 ? Yes : No);
                    205: }
                    206: 
                    207: bool t_is_list(kind) typekind kind; {
                    208:        return (compare((value) kind, (value) lis_kind) EQ 0 ? Yes : No);
                    209: }
                    210: 
                    211: bool t_is_table(kind) typekind kind; {
                    212:        return (compare((value) kind, (value) tab_kind) EQ 0 ? Yes : No);
                    213: }
                    214: 
                    215: bool t_is_lt(kind) typekind kind; {
                    216:        return (compare((value) kind, (value) l_t_kind) EQ 0 ? Yes : No);
                    217: }
                    218: 
                    219: bool t_is_tlt(kind) typekind kind; {
                    220:        return (compare((value) kind, (value) tlt_kind) EQ 0 ? Yes : No);
                    221: }
                    222: 
                    223: bool t_is_compound(kind) typekind kind; {
                    224:        return (compare((value) kind, (value) com_kind) EQ 0 ? Yes : No);
                    225: }
                    226: 
                    227: bool t_is_var(kind) typekind kind; {
                    228:        return (compare((value) kind, (value) var_kind) EQ 0 ? Yes : No);
                    229: }
                    230: 
                    231: bool has_number(kind) typekind kind; {
                    232:        if (compare(kind, num_kind) EQ 0 || compare(kind, t_n_kind) EQ 0)
                    233:                return (Yes);
                    234:        else
                    235:                return (No);
                    236: }
                    237: 
                    238: bool has_text(kind) typekind kind; {
                    239:        if (compare(kind, tex_kind) EQ 0 || compare(kind, t_n_kind) EQ 0)
                    240:                return (Yes);
                    241:        else
                    242:                return (No);
                    243: }
                    244: 
                    245: bool has_lt(kind) typekind kind; {
                    246:        if (compare(kind, l_t_kind) EQ 0 || compare(kind, tlt_kind) EQ 0)
                    247:                return (Yes);
                    248:        else
                    249:                return (No);
                    250: }
                    251: 
                    252: /* The table "typeof" maps the identifiers of the variables (B texts)
                    253:  * to polytypes.
                    254:  */
                    255:  
                    256: value typeof;
                    257: 
                    258: Procedure repl_type_of(u, p) polytype u, p; {
                    259:        replace((value) p, &typeof, Ident(u));
                    260: }
                    261: 
                    262: bool table_has_type_of(u) polytype u; {
                    263:        return(in_keys(Ident(u), typeof));
                    264: }
                    265: 
                    266: polytype type_of(u) polytype u; {
                    267:        return((polytype) *adrassoc(typeof, Ident(u)));
                    268: }
                    269: 
                    270: polytype bottom_var(u) polytype u; {
                    271:        polytype b;
                    272: 
                    273:        if (!t_is_var(Kind(u)))
                    274:                return (u);
                    275:        /* Kind(u) == Variable */
                    276:        while (table_has_type_of(u)) {
                    277:                b = type_of(u);
                    278:                if (t_is_var(Kind(b)))
                    279:                        u = b;
                    280:                else
                    281:                        break;
                    282:        }
                    283:        /* Kind(u) == Variable && !table_has_type_of(u)*/
                    284:        return (u);
                    285: }
                    286: 
                    287: Visible Procedure usetypetable(t) value t; {
                    288:        typeof = t;
                    289: }
                    290: 
                    291: Visible Procedure deltypetable() {
                    292:        release(typeof);
                    293: }
                    294: 
                    295: /* init */
                    296: 
                    297: Visible Procedure initpol() {
                    298:        num_kind = mk_text("Number");
                    299:        num_type = mkt_polytype(num_kind, 0);
                    300:        tex_kind = mk_text("Text");
                    301:        tex_type = mkt_polytype(tex_kind, 0);
                    302:        t_n_kind = mk_text("TN");
                    303:        t_n_type = mkt_polytype(t_n_kind, 0);
                    304:        err_kind = mk_text("Error");
                    305:        err_type = mkt_polytype(err_kind, 0);
                    306:        
                    307:        lis_kind = mk_text("List");
                    308:        tab_kind = mk_text("Table");
                    309:        com_kind = mk_text("Compound");
                    310:        l_t_kind = mk_text("LT");
                    311:        tlt_kind = mk_text("TLT");
                    312:        var_kind = mk_text("Variable");
                    313:        
                    314:        nnewvar = zero;
                    315: }

unix.superglobalmegacorp.com

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