[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc")()
El código de ejemplo con el valor recursiva anterior produce el siguiente error F # compilador:¿Es este un error de citas F #?
error FS0432: [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%'
no puedo ver cualquier uso del operador de rebanado en el código anterior, se ve como un bicho ... :)
Parece que este es el problema con la cita a través de ReflectedDefinitionAttribute
única, cita normal, funciona bien:
let quotation =
<@ let rec x = (fun() -> x + "abc")() in x @>
produce resultado esperado con los ocultos Lazy.create
y Lazy.force
usos:
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) // `
Así que la pregunta es: ¿se trata de un error de compilador de C o no?
¡Gracias por su respuesta, Tomas! No estoy de acuerdo con usted en que cuando estoy escribiendo la versión '[]' que metadata debe parecerse a '<@ (fun() ->% x +" abc ")() @>'. Dentro de la cita, el nombre 'x' debe estar vinculado al valor .NET público, ¡no a la porción de la cita! Si fuera un comportamiento como el que dices, el código como este: '[] let rec f() = (fun() -> f() +" abc ")()' debería producir la misma expectación también, pero no es así –
ControlFlow
@ControlFlow: creo que tu punto tiene sentido. Tal vez esto tiene que hacer algo con valores recursivos que generalmente son algo bastante complicado en F #. –
Creo que también, el manejo de valores recursivos no es una tarea trivial para lenguajes ansiosos como F # ... Tal vez el compilador simplemente debería restringir los usos [] como este. –
ControlFlow