|
|
1.1 root 1: # PDAE(2)
2: #
3: # Programmer-defined argument evaluation regimes
4: #
5: # Ralph E. Griswold and Michael Novak
6: #
7: # Last modified 5/12/83
8: #
9:
10: procedure Allpar(a)
11: local i, x, done
12: x := list(*a)
13: done := list(*a,1)
14: every i := 1 to *a do x[i] := @a[i] | fail
15: repeat {
16: suspend Call(x)
17: every i := 1 to *a do
18: if done[i] = 1 then ((x[i] := @a[i]) | (done[i] := 0))
19: if not(!done = 1) then fail
20: }
21: end
22:
23: procedure Call(a)
24: suspend case *a of {
25: 1 : a[1]()
26: 2 : a[1](a[2])
27: 3 : a[1](a[2],a[3])
28: 4 : a[1](a[2],a[3],a[4])
29: 5 : a[1](a[2],a[3],a[4],a[5])
30: 6 : a[1](a[2],a[3],a[4],a[5],a[6])
31: 7 : a[1](a[2],a[3],a[4],a[5],a[6],a[7])
32: 8 : a[1](a[2],a[3],a[4],a[5],a[6],a[7],a[8])
33: 9 : a[1](a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9])
34: 10 : a[1](a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10])
35: default : stop("Call : too many args.")
36: }
37: end
38:
39: procedure Extract(a)
40: local i, j, n, x
41: x := list(*a/2)
42: repeat {
43: i := 1
44: while i < *a do {
45: n := @a[i] | fail
46: every 1 to n do
47: x[(i + 1)/2] := @a[i + 1] | fail
48: a[i + 1] := ^a[i + 1]
49: i +:= 2
50: }
51: suspend Call(x)
52: }
53: end
54:
55: procedure Lifo(a)
56: local i, x, ptr
57: x := list(*a)
58: ptr := 1
59: repeat {
60: repeat
61: if x[ptr] := @a[ptr]
62: then {
63: ptr +:= 1
64: (a[ptr] := ^a[ptr]) |
65: break
66: }
67: else if (ptr -:= 1) = 0
68: then fail
69: suspend Call(x)
70: ptr := *a
71: }
72: end
73:
74: procedure Parallel(a)
75: local i, x
76: x := list(*a)
77: repeat {
78: every i := 1 to *a do
79: x[i] := @a[i] | fail
80: suspend Call(x)
81: }
82: end
83:
84: procedure Reverse(a)
85: local i, x, ptr
86: x := list(*a)
87: ptr := *a
88: repeat {
89: repeat
90: if x[ptr] := @a[ptr]
91: then {
92: ptr -:= 1
93: (a[ptr] := ^a[ptr]) |
94: break
95: }
96: else if (ptr +:= 1) > *a
97: then fail
98: suspend Call(x)
99: ptr := 1
100: }
101: end
102:
103: procedure Rotate(a)
104: local i, x, done
105: x := list(*a)
106: done := list(*a,1)
107: every i := 1 to *a do x[i] := @a[i] | fail
108: repeat {
109: suspend Call(x)
110: every i := 1 to *a do
111: if not(x[i] := @a[i]) then {
112: done[i] := 0
113: if !done = 1 then {
114: a[i] := ^a[i]
115: x[i] := @a[i] | fail
116: }
117: else fail
118: }
119: }
120: end
121:
122: procedure Simple(a)
123: local i, x
124: x := list(*a)
125: every i := 1 to *a do
126: x[i] := @a[i] | fail
127: return Call(x)
128: end
129:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.