git @ Cat's Eye Technologies Tamsin / 4de759c
Simpler and more successful local collection (and `using`). Cat's Eye Technologies 11 years ago
1 changed file(s) with 50 addition(s) and 53 deletion(s). Raw diff Collapse all Expand all
8888 return production(N, DBs).
8989 analyze(CM, prodbranch(Fs, Ls, E)) =
9090 analyze(CM, E) → DE &
91 locals(E) → Ls & reverse(Ls, nil) → Ls &
91 locals(DE, nil) → Ls &
92 reverse(Ls, nil) → Ls &
9293 return prodbranch(Fs, Ls, DE).
93 analyze(CM, call(prodref(MN, PN), As)) =
94 $:equal(MN, '') & return call(prodref(CM, PN), As)
95 | return call(prodref(MN, PN), As).
94 analyze(CM, call(PR, As)) =
95 analyze(CM, PR) → DPR &
96 analyze_all(CM, As) → DAs &
97 return call(DPR, DAs).
98 analyze(CM, prodref(MN, PN)) =
99 $:equal(MN, '') & return prodref(CM, PN)
100 | return prodref(MN, PN).
96101 analyze(CM, or(L, R)) =
97102 analyze(CM, L) → DL &
98103 analyze(CM, R) → DR &
111116 analyze(CM, L) → DL &
112117 analyze(CM, R) → DR &
113118 return concat(DL, DR).
114 analyze(CM, using(R, P)) =
119 analyze(CM, using(R, PR)) =
115120 analyze(CM, R) → DR &
116 return using(DR, P).
121 analyze(CM, PR) → DPR &
122 return using(DR, DPR).
117123 analyze(CM, send(R, V)) =
118124 analyze(CM, R) → DR &
119125 return send(DR, V).
127133 #####
128134 # returns a list of locals
129135
130 locals(call(PR, As)) =
131 return nil.
132 locals(or(L, R)) =
133 locals(L) → LL &
134 locals(R) → LR &
135 union(LL, LR).
136 locals(and(L, R)) =
137 locals(L) → LL &
138 locals(R) → LR &
139 union(LL, LR).
140 locals(not(X)) =
141 locals(X).
142 locals(while(X)) =
143 locals(X).
144 locals(concat(L, R)) =
145 locals(L) → LL &
146 locals(R) → LR &
147 union(LL, LR).
148 locals(using(R, P)) =
149 locals(R).
150 locals(send(R, V)) =
151 locals(R) → LR &
152 locals(V) → LV &
153 union(LR, LV).
154 locals(set(V, T)) =
155 locals(V) → LV &
156 locals(T) → LT &
157 union(LV, LT).
158 locals(atom(T)) =
159 return nil.
160 locals(constructor(T, Ts)) =
161 locals_all(Ts).
162 locals(variable(N)) =
163 return list(N, nil).
136 locals(call(PR, As), Ls) =
137 Ls.
138 locals(or(L, R), Ls) =
139 locals(L, Ls) → Ls &
140 locals(R, Ls).
141 locals(and(L, R), Ls) =
142 locals(L, Ls) → Ls &
143 locals(R, Ls).
144 locals(not(X), Ls) =
145 locals(X, Ls).
146 locals(while(X), Ls) =
147 locals(X, Ls).
148 locals(concat(L, R), Ls) =
149 locals(L, Ls) → Ls &
150 locals(R, Ls).
151 locals(using(R, P), Ls) =
152 locals(R, Ls).
153 locals(send(R, V), Ls) =
154 locals(V, Ls) → Ls &
155 locals(R, Ls).
156 locals(set(V, T), Ls) =
157 locals(V, Ls) → Ls &
158 locals(T, Ls).
159 locals(atom(T), Ls) = Ls.
160 locals(constructor(T, Ts), Ls) =
161 locals_all(Ts, Ls).
162 locals(variable(N), Ls) =
163 add_elem(N, Ls).
164164
165 locals_all(nil) = nil.
166 locals_all(list(H,T)) =
167 locals(H) → LH &
168 locals_all(T) → LT &
169 union(LH, LT).
170
171 nil = 'nil'.
165 locals_all(nil, Ls) = Ls.
166 locals_all(list(H,T), Ls) =
167 locals(H, Ls) → Ls &
168 locals_all(T, Ls).
172169
173170 member(X, nil) = fail 'not a member'.
174171 member(X, list(H,T)) =
177174 add_elem(X, L) =
178175 member(X, L) & L | return list(X, L).
179176
180 union(nil, L2) = L2.
181 union(list(H,T), L2) =
182 add_elem(H, L2) → L2 &
183 union(T, L2).
184
185 union(Other, L2) = add_elem(Other, L2).
177 # union(nil, L2) = L2.
178 # union(list(H,T), L2) =
179 # add_elem(H, L2) → L2 &
180 # union(T, L2).
181 #
182 # union(Other, L2) = add_elem(Other, L2).
186183
187184 }