[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc")()
L'exemple de code avec la valeur récursive produit le document suivant F erreur # compilateur:Est-ce un bug des citations F #?
error FS0432: [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%'
Je ne vois pas l'utilisation de l'opérateur de découpage en tranches dans le code ci-dessus, ressemble à un bug ... :)
On dirait que c'est le problème avec la citation par ReflectedDefinitionAttribute
seulement, fonctionne bien normale cotation:
let quotation =
<@ let rec x = (fun() -> x + "abc")() in x @>
produit résultat attendu avec les cachés Lazy.create
et Lazy.force
usages:
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) // `
La question est donc: est-ce un bug F # compilateur ou non?
Merci pour votre réponse, Tomas! Je ne suis pas d'accord avec vous lorsque j'écris la version '[<]' que les métadonnées devraient ressembler '<@ (fun() ->% x +" abc ")() @>'. Entre guillemets, le nom 'x' devrait être lié à la valeur publique .NET, et non à la tranche de devis! Si le comportement est comme vous le dites, le code comme ceci: '[] laissez rec f() = (fun() -> f() +" abc ")()' devrait produire la même expecption, mais ce n'est pas le cas. –
ControlFlow
@ControlFlow: Je pense que votre argument est logique. Peut-être que cela doit faire quelque chose avec des valeurs récursives qui sont généralement assez compliquées en F #. –
Je pense aussi, la gestion des valeurs récursives est une tâche non triviale pour les langages avides comme F # ... Peut-être que le compilateur devrait simplement restreindre les utilisations [] comme ça. –
ControlFlow