fsharp / fsharp/fslang-suggestions

Complete FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.QuotationToExpression

Open
#956 1 comment 0 reactions 0 assignees View on GitHub
approved-in-principle area: library
Dominant language
No language data
Stars
373
Forks
21
PR merge metrics
No merged PRs in 30d

Description

It is especially unexpected when
```fs
Linq.RuntimeHelpers.LeafExpressionConverter.QuotationToLambdaExpression <@ System.Func(fun x -> System.Console.WriteLine "1"; System.Console.WriteLine "2"; x) @>
```
fails with
```fs
System.NotSupportedException: Could not convert the following F# Quotation to a LINQ Expression Tree
--------
Sequential (Call (None, WriteLine, [Value ("1")]),
Sequential (Call (None, WriteLine, [Value ("2")]), x))
-------------
```
when `System.Linq.Expressions.Expression.Block` is available.

`VarSet` is also not convertible despite the existence of `System.Linq.Expressions.Expression.Assign`.

Ditto `PropertySet`, `FieldSet`, `TryWith`, `TryFinally`, `ForIntegerRangeLoop`, and `WhileLoop`.

The existing way of approaching this problem in F# is hand-building expressions without using quotations.

Are there expressions that are unconvertible from quotations to expressions instead of just not being implemented?

`raise` and `reraise` should be treated as special functions and be converted to special expressions just like conversion operators as well.

## Pros and Cons

The advantages of making this adjustment to F# are
1. Enabling more efficient reflection-based code
2. Allowing more uses of quotations to compile code on-the-fly

The disadvantages of making this adjustment to F# are none?

## Extra information

Estimated cost (XS, S, M, L, XL, XXL): S to M

Related suggestions: (put links to related suggestions here)

## Affidavit (please submit!)

Please tick this by placing a cross in the box:
* [x] This is not a question (e.g. like one you might ask on [stackoverflow](http://stackoverflow.com)) and I have searched stackoverflow for discussions of this issue
* [x] I have [searched both open and closed suggestions on this site](http://github.com/fsharp/fslang-suggestions/issues) and believe this is not a duplicate
* [x] This is not something which has obviously "already been decided" in previous versions of F#. If you're questioning a fundamental design decision that has obviously already been taken (e.g. "Make F# untyped") then please don't submit it.

Please tick all that apply:
* [x] This is not a breaking change to the F# language design
* [x] I or my company would be willing to help implement and/or test this

## For Readers

If you would like to see this issue implemented, please click the :+1: emoji on this issue. These counts are used to generally order the suggestions by engagement.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start at LeafExpressionConverter.QuotationToExpression and review how quotation nodes are mapped to LINQ expression trees. Compare the listed unsupported constructs with the available Expression APIs, including Block, Assign, exception handling, loops, and special handling for raise and reraise. Done means the supported cases convert successfully and are covered by tests.

Written by the indexing model from the issue text.

Assessment

Tech stack
fsharp
Domain
compilers
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.