|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ ! 2: /* $Header: b2env.c,v 1.1 84/06/28 00:49:06 timo Exp $ */ ! 3: ! 4: /* Environments */ ! 5: #include "b.h" ! 6: #include "b1obj.h" ! 7: ! 8: envtab prmnvtab; ! 9: envchain prmnvchain; ! 10: env prmnv; ! 11: ! 12: /* context: */ ! 13: env curnv; value *bndtgs; value bndtglist; ! 14: literal cntxt, resexp; value uname; literal utype; ! 15: intlet cur_ilev, lino; txptr tx, ceol; ! 16: ! 17: context read_context; ! 18: context how_context; ! 19: ! 20: bool xeq= Yes; ! 21: ! 22: Visible Procedure sv_context(sc) context *sc; { ! 23: sc->curnv= curnv; ! 24: sc->bndtgs= bndtgs; ! 25: sc->cntxt= cntxt; ! 26: sc->resexp= resexp; ! 27: sc->uname= uname; ! 28: sc->utype= utype; ! 29: sc->cur_ilev= cur_ilev; ! 30: sc->lino= lino; ! 31: sc->tx= tx; ! 32: sc->ceol= ceol; ! 33: } ! 34: ! 35: Visible Procedure set_context(sc) context *sc; { ! 36: curnv= sc->curnv; ! 37: bndtgs= sc->bndtgs; ! 38: cntxt= sc->cntxt; ! 39: resexp= sc->resexp; ! 40: uname= sc->uname; ! 41: utype= sc->utype; ! 42: cur_ilev= sc->cur_ilev; ! 43: lino= sc->lino; ! 44: tx= sc->tx; ! 45: ceol= sc->ceol; ! 46: } ! 47: ! 48: Visible Procedure initenv() { ! 49: /* The following invariant must be maintained: ! 50: EITHER: ! 51: the original permanent-environment table resides in prmnv->tab ! 52: and prmnvtab == Vnil ! 53: OR: ! 54: the original permanent-environment table resides in prmnvtab ! 55: and prmnv->tab contains a scratch-pad copy. ! 56: */ ! 57: prmnv= &prmnvchain; ! 58: prmnv->tab= mk_elt(); prmnvtab= Vnil; ! 59: prmnv->inv_env= Enil; ! 60: bndtglist= mk_elt(); ! 61: } ! 62: ! 63: Visible Procedure re_env() { ! 64: setprmnv(); bndtgs= &bndtglist; ! 65: } ! 66: ! 67: Visible Procedure setprmnv() { ! 68: /* the current and permanent environment are reset ! 69: to the original permanent environment */ ! 70: if (prmnvtab != Vnil) { ! 71: prmnv->tab= prmnvtab; ! 72: prmnvtab= Vnil; ! 73: } ! 74: curnv= prmnv; ! 75: } ! 76: ! 77: Visible Procedure e_replace(v, t, k) value v, *t, k; { ! 78: if (!Is_table(*t)) syserr("replacing in non-environment"); ! 79: else replace(v, t, k); ! 80: } ! 81: ! 82: Visible Procedure e_delete(t, k) value *t, k; { ! 83: if (!Is_table(*t)) syserr("deleting from non-environment"); ! 84: if (in_keys(k, *t)) delete(t, k); ! 85: } ! 86: ! 87: Visible value* envassoc(t, ke) value t, ke; { ! 88: if (!Is_table(t)) syserr("selection on non-environment"); ! 89: return adrassoc(t, ke); ! 90: } ! 91: ! 92: Visible bool in_env(tab, ke, aa) value tab, ke, **aa; { ! 93: /* IF ke in keys tab: ! 94: PUT tab[ke] IN aa ! 95: SUCCEED ! 96: FAIL ! 97: */ ! 98: *aa= envassoc(tab, ke); ! 99: return (*aa != Pnil); ! 100: } ! 101: ! 102: Visible Procedure extbnd_tags(btl, en, et) value btl; envtab *en, et; { ! 103: /* FOR v IN btl: ! 104: IF v in keys et: ! 105: PUT et[v] IN en[v] ! 106: */ ! 107: value *aa, v; ! 108: int len= length(btl), k; ! 109: for (k= 1; k <= len; k++) { ! 110: v= thof(k, btl); ! 111: if (in_env(et, v, &aa)) e_replace(*aa, en, v); ! 112: release(v); ! 113: } ! 114: } ! 115: ! 116: Visible Procedure restore_env(e0) env e0; { ! 117: /*not yet implemented*/ ! 118: } ! 119: ! 120: Visible value* lookup(t) value t; { ! 121: return envassoc(curnv->tab, t); ! 122: } ! 123:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.