# Generalized image of Icon object
if match("record ",image(x)) then return rimage(x,done)
else return case type(x) of {
if \done[a] then return done[a]
done[a] := tag := "L" || (i +:= 1)
if *a = 0 then s := tag || ":[]" else {
every s ||:= Image(!a,done) || ","
# might be record constructor
if match("record constructor ",s) then return s
if \done[x] then return done[x]
done[x] := tag := "R" || (i +:= 1)
s ?:= (="record " & (":" || (tab(upto('(') + 1))))
if *x = 0 then s := tag || s || ")" else {
every s ||:= Image(!x,done) || ","
if \done[t] then return done[t]
done[t] := tag := "T" || (i +:= 1)
if *t = 0 then s := tag || ":[]" else {
s ||:= Image(a1[1],done) || "->" || Image(a1[2],done) || ","
if match("record ",image(x)) then return indent || rimagex(x,done)
else return case type(x) of {
"list": indent || limagex(x,done)
"table": indent || timagex(x,done)
default: indent || image(x)
procedure limagex(a,done)
if \done[a] then return done[a]
done[a] := tag := "L" || (i +:= 1)
if *a = 0 then s := tag || ":[]" else {
every s ||:= "\n" || Image(!a,done)
s ||:= "\n" || indent || "]"
procedure rimagex(x,done)
# might be record constructor
if match("record constructor ",s) then return s
if \done[x] then return done[x]
done[x] := tag := "R" || (i +:= 1)
s ?:= (="record " & (":" || (tab(upto('(') + 1))))
if *x = 0 then s := tag || s || ")" else {
every s ||:= "\n" || Image(!x,done)
s ||:= "\n" || indent || ")"
procedure timagex(t,done)
if \done[t] then return done[t]
done[t] := tag := "T" || (i +:= 1)
if *t = 0 then s := tag || ":{}" else {
s ||:= "\n" || Image(a1[1],done) || "\n" || indent || "---" ||
"\n" || Image(a1[2],done) || "\n" || indent || "------"
s ||:= "\n" || indent || "]"