|
|
1.1 ! root 1: # IMAGE ! 2: # ! 3: # Generalized image of Icon object ! 4: # ! 5: # Ralph E. Griswold ! 6: # ! 7: # Last modified 2/1/86 ! 8: # ! 9: ! 10: procedure Image(x,done) ! 11: /done := table() ! 12: if match("record ",image(x)) then return rimage(x,done) ! 13: else return case type(x) of { ! 14: "list": limage(x,done) ! 15: "table": timage(x,done) ! 16: "set": simage(x,done) ! 17: default: image(x) ! 18: } ! 19: end ! 20: ! 21: # list image ! 22: # ! 23: procedure limage(a,done) ! 24: static i ! 25: local s, tag ! 26: initial i := 0 ! 27: if \done[a] then return done[a] ! 28: done[a] := tag := "L" || (i +:= 1) ! 29: if *a = 0 then s := tag || ":[]" else { ! 30: s := tag || ":[" ! 31: every s ||:= Image(!a,done) || "," ! 32: s[-1] := "]" ! 33: } ! 34: return s ! 35: end ! 36: ! 37: # record image ! 38: # ! 39: procedure rimage(x,done) ! 40: static i ! 41: local s, tag ! 42: initial i := 0 ! 43: s := image(x) ! 44: # might be record constructor ! 45: if match("record constructor ",s) then return s ! 46: if \done[x] then return done[x] ! 47: done[x] := tag := "R" || (i +:= 1) ! 48: s ?:= (="record " & (":" || (tab(upto('(') + 1)))) ! 49: if *x = 0 then s := tag || s || ")" else { ! 50: s := tag || s ! 51: every s ||:= Image(!x,done) || "," ! 52: s[-1] := ")" ! 53: } ! 54: return s ! 55: end ! 56: ! 57: # set image ! 58: # ! 59: procedure simage(S,done) ! 60: static i ! 61: local s, tag ! 62: initial i := 0 ! 63: if \done[S] then return done[S] ! 64: done[S] := tag := "S" || (i +:= 1) ! 65: if *S = 0 then s := tag || ":[]" else { ! 66: s := tag || ":[" ! 67: every s ||:= Image(!S,done) || "," ! 68: s[-1] := "]" ! 69: } ! 70: return s ! 71: end ! 72: ! 73: # table image ! 74: # ! 75: procedure timage(t,done) ! 76: static i ! 77: local s, tag, a, a1 ! 78: initial i := 0 ! 79: if \done[t] then return done[t] ! 80: done[t] := tag := "T" || (i +:= 1) ! 81: if *t = 0 then s := tag || ":[]" else { ! 82: a := sort(t,3) ! 83: s := tag || ":[" ! 84: while s ||:= Image(get(a),done) || "->" || Image(get(a),done) || "," ! 85: s[-1] := "]" ! 86: } ! 87: return s ! 88: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.