|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
2: /* $Header: b2typ.c,v 1.1 84/06/28 00:49:27 timo Exp $ */
3:
4: /* Type matching */
5: #include "b.h"
6: #include "b1obj.h"
7: #include "b2env.h"
8: #include "b2sem.h"
9: #include "b2typ.h"
10:
11: #define Tnil ((btype) Vnil)
12:
13: Forward btype valtype();
14:
15: /* All the routines in this file are temporary */
16: /* Thus length() and empty() have been put here too */
17:
18: Visible int length(v) value v; {
19: value s= size(v);
20: int len= intval(s);
21: release(s);
22: return len;
23: }
24:
25: Visible bool empty(v) value v; {
26: value s= size(v);
27: bool b= large(s) || intval(s)!=0;
28: release(s);
29: return !b;
30: }
31:
32: Visible btype loctype(l) loc l; {
33: value *ll;
34: if (Is_simploc(l)) {
35: simploc *sl= Simploc(l);
36: if (!in_env(sl->e->tab, sl->i, &ll)) return Tnil;
37: return valtype(*ll);
38: } else if (Is_tbseloc(l)) {
39: tbseloc *tl= Tbseloc(l);
40: btype tt= loctype(tl->R), associate;
41: if (tt == Tnil) return Tnil;
42: if (!empty(tt)) associate= th_of(one, tt);
43: else associate= Tnil;
44: release(tt);
45: return associate;
46: } else if (Is_trimloc(l)) {
47: return mk_text("");
48: } else if (Is_compound(l)) {
49: btype ct= mk_compound(Nfields(l)); intlet k, len= Nfields(l);
50: k_Overfields { put_in_field(loctype(*field(l, k)), &ct, k); }
51: return ct;
52: } else {
53: syserr("loctype asked of non-target");
54: return Tnil;
55: }
56: }
57:
58: Visible btype valtype(v) value v; {
59: if (Is_number(v)) return mk_integer(0);
60: else if (Is_text(v)) return mk_text("");
61: else if (Is_compound(v)) {
62: btype ct= mk_compound(Nfields(v)); intlet k, len= Nfields(v);
63: k_Overfields { put_in_field(valtype(*field(v, k)), &ct, k); }
64: return ct;
65: } else if (Is_ELT(v)) {
66: return mk_elt();
67: } else if (Is_list(v)) {
68: btype tt= mk_elt(), vt, ve;
69: if (!empty(v)) {
70: insert(vt= valtype(ve= min1(v)), &tt);
71: release(vt); release(ve);
72: }
73: return tt;
74: } else if (Is_table(v)) {
75: btype tt= mk_elt(), vk, va;
76: if (!empty(v)) {
77: vk= valtype(*key(v, 0));
78: va= valtype(*assoc(v, 0));
79: replace(va, &tt, vk);
80: release(vk); release(va);
81: }
82: return tt;
83: } else {
84: syserr("valtype called with unknown type");
85: return Tnil;
86: }
87: }
88:
89: Visible must_agree(t, u, m) btype t, u; string m; {
90: intlet k, len;
91: value vt, vu;
92: if (t == Tnil || u == Tnil || t == u) return;
93: if ((Is_number(t) && Is_number(u))
94: || (Is_text(t) && Is_text(u))
95: || (Is_ELT(u) && (Is_ELT(t) || Is_list(t) || Is_table(t)))
96: || (Is_ELT(t) && (Is_ELT(u) || Is_list(u) || Is_table(u)))) return;
97: else if (Is_compound(t) && Is_compound(u)) {
98: if ((len= Nfields(t)) != Nfields(u)) error(m);
99: else k_Overfields { must_agree(*field(t,k), *field(u,k), m); }
100: } else {
101: if (Is_list(t) && Is_list(u)) {
102: if (!empty(t) && !empty(u)) {
103: must_agree(vt= min1(t), vu= min1(u), m);
104: release(vt); release(vu);
105: }
106: } else if (Is_table(t) && Is_table(u)) {
107: if (!empty(t) && !empty(u)) {
108: must_agree(*key(t, 0), *key(u, 0), m);
109: must_agree(*assoc(t, 0), *assoc(u, 0), m);
110: }
111: } else error(m);
112: }
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.