[<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 # или нет?
[<ReflectedDefinition>]
, метаданные должны выглядеть как<@ (fun() -> %x + "abc") () @>
. Внутри цитаты имяx
должно быть привязано к общедоступному значению .NET, а не к фрагменту цитаты! Если бы это вело себя так, как вы говорите, код вроде этого:[<ReflectedDefinition>] let rec f () = (fun() -> f () + "abc") ()
тоже должен давать такое же ожидание, но это не так. 30.05.2010