[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc")()
재귀 값이 위의 다음과 같은 F # 컴파일러 오류가 발생하여 샘플 코드 :F # quotations 버그입니까?
error FS0432: [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%'
내가 위의 코드에있는 슬라이스 연산자 사용을 볼 수는 ... :) 버그처럼 보이는 이 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 # 컴파일러의 버그인지?
답변 해 주셔서 감사합니다. 토마스! 메타 데이터가 '<@ (fun() -> % x + "abc")() @>'처럼 보이는'[]'버전을 쓰고있는 것에 동의하지 않습니다. 인용문 안의'x' 이름은 인용문 슬라이스가 아닌 public .NET 값에 바인딩되어야합니다! 만약 당신이 말한 것처럼 행동한다면,'[] let rec() = (fun() -> f() + "abc")()'같은 expecption을 만들어야한다. 그러나 그렇지 않습니다. –
ControlFlow
@ControlFlow : 귀하의 요점이 맞다고 생각합니다. 어쩌면 이것은 F #에서 일반적으로 매우 복잡한 것 인 재귀 적 값으로 무언가를해야만합니다. –
필자도 그렇게 생각합니다. F #과 같은 열망한 언어에서는 재귀 값을 다루는 것이 쉽지 않을 것입니다. 컴파일러는 [] 사용법을 이와 같이 제한해야합니다. –
ControlFlow