351 end) |
351 end) |
352 | case_prod_guess_names_tr' _ _ = raise Match; |
352 | case_prod_guess_names_tr' _ _ = raise Match; |
353 in [(@{const_syntax case_prod}, K case_prod_guess_names_tr')] end |
353 in [(@{const_syntax case_prod}, K case_prod_guess_names_tr')] end |
354 \<close> |
354 \<close> |
355 |
355 |
|
356 text \<open>reconstruct pattern from (nested) @{const case_prod}s, |
|
357 avoiding eta-contraction of body; required for enclosing "let", |
|
358 if "let" does not avoid eta-contraction, which has been observed to occur\<close> |
|
359 |
|
360 print_translation \<open> |
|
361 let |
|
362 fun case_prod_tr' [Abs (x, T, t as (Abs abs))] = |
|
363 (* case_prod (\<lambda>x y. t) \<Rightarrow> \<lambda>(x, y) t *) |
|
364 let |
|
365 val (y, t') = Syntax_Trans.atomic_abs_tr' abs; |
|
366 val (x', t'') = Syntax_Trans.atomic_abs_tr' (x, T, t'); |
|
367 in |
|
368 Syntax.const @{syntax_const "_abs"} $ |
|
369 (Syntax.const @{syntax_const "_pattern"} $ x' $ y) $ t'' |
|
370 end |
|
371 | case_prod_tr' [Abs (x, T, (s as Const (@{const_syntax case_prod}, _) $ t))] = |
|
372 (* case_prod (\<lambda>x. (case_prod (\<lambda>y z. t))) \<Rightarrow> \<lambda>(x, y, z). t *) |
|
373 let |
|
374 val Const (@{syntax_const "_abs"}, _) $ |
|
375 (Const (@{syntax_const "_pattern"}, _) $ y $ z) $ t' = |
|
376 case_prod_tr' [t]; |
|
377 val (x', t'') = Syntax_Trans.atomic_abs_tr' (x, T, t'); |
|
378 in |
|
379 Syntax.const @{syntax_const "_abs"} $ |
|
380 (Syntax.const @{syntax_const "_pattern"} $ x' $ |
|
381 (Syntax.const @{syntax_const "_patterns"} $ y $ z)) $ t'' |
|
382 end |
|
383 | case_prod_tr' [Const (@{const_syntax case_prod}, _) $ t] = |
|
384 (* case_prod (case_prod (\<lambda>x y z. t)) \<Rightarrow> \<lambda>((x, y), z). t *) |
|
385 case_prod_tr' [(case_prod_tr' [t])] |
|
386 (* inner case_prod_tr' creates next pattern *) |
|
387 | case_prod_tr' [Const (@{syntax_const "_abs"}, _) $ x_y $ Abs abs] = |
|
388 (* case_prod (\<lambda>pttrn z. t) \<Rightarrow> \<lambda>(pttrn, z). t *) |
|
389 let val (z, t) = Syntax_Trans.atomic_abs_tr' abs in |
|
390 Syntax.const @{syntax_const "_abs"} $ |
|
391 (Syntax.const @{syntax_const "_pattern"} $ x_y $ z) $ t |
|
392 end |
|
393 | case_prod_tr' _ = raise Match; |
|
394 in [(@{const_syntax case_prod}, K case_prod_tr')] end |
|
395 \<close> |
|
396 |
356 |
397 |
357 subsubsection \<open>Code generator setup\<close> |
398 subsubsection \<open>Code generator setup\<close> |
358 |
399 |
359 code_printing |
400 code_printing |
360 type_constructor prod \<rightharpoonup> |
401 type_constructor prod \<rightharpoonup> |