FSharp.Compiler.Service 43.12.201 #850
Conversation
| | SynExpr.LetOrUse(_, _, bindings, body, _, _) -> | ||
| let instanceNames = extraFromBindings bindings List.Empty |> Set.ofList | ||
| processLetBinding instanceNames body returnEmptyArray | ||
| | SynExpr.LetOrUse letOrUse when not letOrUse.IsBang -> |
There was a problem hiding this comment.
This one is using when because when I tried the active pattern I got error FS3569: The member or function 'processLetBinding' has the 'TailCallAttribute' attribute, but is not being used in a tail recursive way.
There was a problem hiding this comment.
That's what the TailCall attrib is for: so that the compiler makes sure you're using a tail call recursive algorithm. If you mark a func as TailCall without changing the algorithm to be a tail-call-recursive, compilation will fail.
|
Looks like the performance is still bad without #845 |
|
Ok, this version of FCS should contain the fix we need (dotnet/fsharp@89d7886), can you please include a commit to remove this workaround: 755f4d1 ? |
479a535 to
e6b1813
Compare
Done |
0f223d3 to
ca139ca
Compare
Most of the changes are down to the LetOrUse changes in: dotnet/fsharp#19090 The ExpressionUtilities.LetOrUse active pattern was taken from an implementation detail of that change as well as it avoids using when clauses in lots of places.
This reverts commit 755f4d1 because the workaround is not needed anymore, now that we use a new enough FCS dependency.
This contains the whole of #770, plus an extra commit to update to FCS 43.12.201 (I'm not clear what's going on with the version numbers here)
Needs a review to see if the 'ExpressionUtilities.LetOrUse' helper is the right approach.