|
|
1.1 root 1: # STRUCTS
2: #
3: # Structure operations
4: #
5: # Ralph E. Griswold
6: #
7: # Last modified 2/1/86
8: #
9:
10: procedure eq(x,y)
11: local i
12: if x === y then return y
13: if type(x) == type(y) == "list" then {
14: if *x ~= *y then fail
15: every i := 1 to *x do
16: if not eq(x[i],y[i]) then fail
17: return y
18: }
19: end
20:
21: procedure depth(ltree)
22: local count
23: count := 0
24: every count <:= 1 + depth(ltree[2 to *ltree])
25: return count
26: end
27:
28: procedure ldag(stree,done)
29: local a
30: /done := table()
31: if a := \done[stree] then return a
32: stree ?
33: if a := [tab(upto('('))] then {
34: move(1)
35: while put(a,ldag(tab(bal(',)')),done)) do
36: move(1)
37: }
38: else a := [tab(0)]
39: return done[stree] := a
40: end
41:
42: procedure ltree(stree)
43: local a
44: stree ?
45: if a := [tab(upto('('))] then {
46: move(1)
47: while put(a,ltree(tab(bal(',)')))) do
48: move(1)
49: }
50: else a := [tab(0)]
51: return a
52: end
53:
54: procedure stree(ltree)
55: local s
56: if *ltree = 1 then return ltree[1]
57: s := ltree[1] || "("
58: every s ||:= stree(ltree[2 to *ltree]) || ","
59: return s[1:-1] || ")"
60: end
61:
62: procedure tcopy(ltree)
63: local a
64: a := [ltree[1]]
65: every put(a,tcopy(ltree[2 to *ltree]))
66: return a
67: end
68:
69: procedure teq(a1,a2)
70: local i
71: if *a1 ~= *a2 then fail
72: if a1[1] ~== a2[1] then fail
73: every i := 2 to *a1 do
74: if not teq(a1[i],a2[i]) then fail
75: return a2
76: end
77:
78: procedure visit(ltree)
79: suspend ltree | visit(ltree[2 to *ltree])
80: end
81:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.