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