206 else raise TERM ("gen_field_tr: " ^ mark, [t]) |
206 else raise TERM ("gen_field_tr: " ^ mark, [t]) |
207 | gen_field_tr mark _ t = raise TERM ("gen_field_tr: " ^ mark, [t]); |
207 | gen_field_tr mark _ t = raise TERM ("gen_field_tr: " ^ mark, [t]); |
208 |
208 |
209 fun gen_fields_tr sep mark sfx (tm as Const (c, _) $ t $ u) = |
209 fun gen_fields_tr sep mark sfx (tm as Const (c, _) $ t $ u) = |
210 if c = sep then gen_field_tr mark sfx t :: gen_fields_tr sep mark sfx u |
210 if c = sep then gen_field_tr mark sfx t :: gen_fields_tr sep mark sfx u |
211 else [gen_field_tr mark sfx tm] |
211 else [gen_field_tr mark sfx tm] |
212 | gen_fields_tr _ mark sfx t = [gen_field_tr mark sfx t]; |
212 | gen_fields_tr _ mark sfx tm = [gen_field_tr mark sfx tm]; |
213 |
213 |
214 fun gen_record_tr sep mark sfx unit [t] = foldr (op $) (gen_fields_tr sep mark sfx t, unit) |
214 fun gen_record_tr sep mark sfx unit [t] = foldr (op $) (gen_fields_tr sep mark sfx t, unit) |
215 | gen_record_tr _ _ _ _ ts = raise TERM ("record_tr", ts); |
215 | gen_record_tr _ _ _ _ ts = raise TERM ("gen_record_tr", ts); |
216 |
216 |
217 fun gen_record_scheme_tr sep mark sfx [t, more] = foldr (op $) (gen_fields_tr sep mark sfx t, more) |
217 fun gen_record_scheme_tr sep mark sfx [t, more] = foldr (op $) (gen_fields_tr sep mark sfx t, more) |
218 | gen_record_scheme_tr _ _ _ ts = raise TERM ("record_scheme_tr", ts); |
218 | gen_record_scheme_tr _ _ _ ts = raise TERM ("gen_record_scheme_tr", ts); |
219 |
219 |
220 |
220 |
221 val record_type_tr = gen_record_tr "_field_types" "_field_type" field_typeN (Syntax.const "unit"); |
221 val record_type_tr = gen_record_tr "_field_types" "_field_type" field_typeN (Syntax.const "unit"); |
222 val record_type_scheme_tr = gen_record_scheme_tr "_field_types" "_field_type" field_typeN; |
222 val record_type_scheme_tr = gen_record_scheme_tr "_field_types" "_field_type" field_typeN; |
223 |
223 |
237 ("_record_update", record_update_tr)]; |
237 ("_record_update", record_update_tr)]; |
238 |
238 |
239 |
239 |
240 (* print translations *) |
240 (* print translations *) |
241 |
241 |
242 fun gen_field_tr' sfx f name = |
|
243 let val name_sfx = suffix sfx name |
|
244 in (name_sfx, fn [t, u] => f (Syntax.const name_sfx $ t $ u) | _ => raise Match) end; |
|
245 |
|
246 fun gen_fields_tr' mark sfx (tm as Const (name_field, _) $ t $ u) = |
242 fun gen_fields_tr' mark sfx (tm as Const (name_field, _) $ t $ u) = |
247 (case try (unsuffix sfx) name_field of |
243 (case try (unsuffix sfx) name_field of |
248 Some name => |
244 Some name => |
249 apfst (cons (Syntax.const mark $ Syntax.free name $ t)) (gen_fields_tr' mark sfx u) |
245 apfst (cons (Syntax.const mark $ Syntax.free name $ t)) (gen_fields_tr' mark sfx u) |
250 | None => ([], tm)) |
246 | None => ([], tm)) |
271 let val (ts, u) = gen_fields_tr' "_update" updateN tm in |
267 let val (ts, u) = gen_fields_tr' "_update" updateN tm in |
272 Syntax.const "_record_update" $ u $ |
268 Syntax.const "_record_update" $ u $ |
273 foldr1 (fn (v, w) => Syntax.const "_updates" $ v $ w) (rev ts) |
269 foldr1 (fn (v, w) => Syntax.const "_updates" $ v $ w) (rev ts) |
274 end; |
270 end; |
275 |
271 |
|
272 |
|
273 fun gen_field_tr' sfx tr' name = |
|
274 let val name_sfx = suffix sfx name |
|
275 in (name_sfx, fn [t, u] => tr' (Syntax.const name_sfx $ t $ u) | _ => raise Match) end; |
276 |
276 |
277 fun print_translation names = |
277 fun print_translation names = |
278 map (gen_field_tr' field_typeN record_type_tr') names @ |
278 map (gen_field_tr' field_typeN record_type_tr') names @ |
279 map (gen_field_tr' fieldN record_tr') names @ |
279 map (gen_field_tr' fieldN record_tr') names @ |
280 map (gen_field_tr' updateN record_update_tr') names; |
280 map (gen_field_tr' updateN record_update_tr') names; |