[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc") ()
上記の再帰値を持つサンプルコードは、次のF#コンパイラエラーを生成します。
エラーFS0432:[<ReflectedDefinition>]用語にプレフィックススプライス演算子'%'の使用を含めることはできません
上記のコードでスライシング演算子の使用法を確認できません。バグのようです...:)
これは、経由のみの見積もりの問題のようですReflectedDefinitionAttribute
。通常の見積もりは適切に機能します。
let quotation =
<@ let rec x = (fun() -> x + "abc") () in x @>
Lazy.create
非表示のLazy.force
使用法で期待される結果を生成します。
val quotation : Quotations.Expr<string> =
LetRecursive
([(x, Lambda (unitVar,
Application
(Lambda (unitVar0,
Call (None,
String op_Addition[String,String,String](String, String),
[Call (None,
String Force[String](Lazy`1[System.String]), // `
[x]), Value ("abc")])),
Value (<null>)))),
(x, Call (None, Lazy`1[String] Create[String](FSharpFunc`2[Unit,String]), [x])),
(x, Call (None, String Force[String](Lazy`1[String]), [x]))], x) // `
したがって、問題は、これはF#コンパイラのバグかどうかということです。