[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc")()
與上面的遞歸值會產生以下F#編譯器錯誤示例代碼:這是一個F#語錄錯誤嗎?
error FS0432: [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%'
我看不到上面的代碼中的任何切片運算符的使用,看起來像一個bug ...... :)
看起來這是通過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'名稱應該綁定到公共.NET值,而不是引用片段!如果它的行爲像你說的那樣,代碼就像這樣:'[]讓rec f()=(fun() - > f()+「abc」)()'也會產生相同的效果,但事實並非如此。 –
ControlFlow
2010-05-30 16:06:39
@ControlFlow:我認爲你的觀點是有道理的。也許這必須通過遞歸值來實現,這在F#中通常是非常複雜的事情。 – 2010-05-30 16:15:54
我也這麼認爲,處理遞歸值對於像F#這樣渴望的語言來說是不平凡的任務......也許編譯器應該像這樣簡單地限制[]用法。 –
ControlFlow
2010-05-30 16:29:11