src/HOL/Tools/record_package.ML
changeset 5201 fac6fea3b782
parent 5197 69c77ed95ba3
child 5210 54aaa779b6b4
equal deleted inserted replaced
5200:a23c23af335f 5201:fac6fea3b782
   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;