unison/unison-src/transcripts/fix3265.output.md
Greg Pfeil 0031542faf
Add a space before code block info strings
This is for consistency with the `cmark` style. Now the blocks we still
pretty-print ourselves will match the bulk of them that `cmark`
produces.
2024-07-10 13:56:07 -06:00

2.0 KiB

Tests cases that produced bad decompilation output previously. There are three cases that need to be 'fixed up.'

  1. lambda expressions with free variables need to be beta reduced
  2. let defined functions need to have arguments removed and occurrences rewritten.
  3. let-rec defined functions need to have arguments removed, but it is a more complicated process.
> Any (w x -> let
    f0 y = match y with
       0 -> x
       n -> 1 + f1 (drop y 1)
    f1 y = match y with
       0 -> w + x
       n -> 1 + f0 (drop y 1)
    f2 x = f2 x
    f3 y = 1 + y + f2 x
    g h = h 1 + x
    g (z -> x + f0 z))

  Loading changes detected in scratch.u.

  ✅
  
  scratch.u changed.
  
  Now evaluating any watch expressions (lines starting with
  `>`)... Ctrl+C cancels.

    1 | > Any (w x -> let
          ⧩
          Any
            (w x ->
              let
                use Nat + drop
                f1 y = match y with
                  0 -> w + x
                  n -> 1 + f0 (drop y 1)
                f0 y = match y with
                  0 -> x
                  n -> 1 + f1 (drop y 1)
                f2 x = f2 x
                f3 x y = 1 + y + f2 x
                g h = h 1 + x
                g (z -> x + f0 z))

Also check for some possible corner cases.

f should not have its x argument eliminated, because it doesn't always occur with x as the first argument, but if we aren't careful, we might do that, because we find the first occurrence of f, and discard its arguments, where f also occurs.

> Any (x -> let
    f x y = match y with
      0 -> 0
      _ -> f x (f y (drop y 1))

    f x 20)

  Loading changes detected in scratch.u.

  ✅
  
  scratch.u changed.
  
  Now evaluating any watch expressions (lines starting with
  `>`)... Ctrl+C cancels.

    1 | > Any (x -> let
          ⧩
          Any
            (x ->
              let
                f x y = match y with
                  0 -> 0
                  _ -> f x (f y (Nat.drop y 1))
                f x 20)