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