[<ReflectedDefinition>]
let rec x = (fun() -> x + "abc")()
Các mẫu mã với giá trị đệ quy trên sản xuất F # trình biên dịch báo lỗi sau:Đây có phải là lỗi báo giá F # không?
error FS0432: [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%'
Tôi không thể nhìn thấy bất kỳ việc sử dụng toán tử cắt trong đoạn mã trên, trông giống như một lỗi ... :)
Hình như đây là vấn đề với báo giá qua ReflectedDefinitionAttribute
chỉ, báo giá bình thường hoạt động tốt:
let quotation =
<@ let rec x = (fun() -> x + "abc")() in x @>
sản xuất kết quả dự kiến với ẩn Lazy.create
và Lazy.force
tập quán:
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) // `
Vì vậy, câu hỏi là: đây là một F # biên dịch lỗi hay không?
Cảm ơn câu trả lời của bạn, Tomas! Tôi không đồng ý với bạn rằng khi tôi đang viết phiên bản '[]' mà siêu dữ liệu sẽ trông giống như '<@ (fun() ->% x + "abc")() @> '. Bên trong ngoặc kép, tên 'x' phải được ràng buộc với giá trị .NET công khai, không phải là dấu ngoặc kép! Nếu nó hoạt động giống như bạn nói, đoạn mã như thế này: '[] cho phép rec f() = (fun() -> f() +" abc ")()' cũng nên tạo ra cùng một sự giải thích, nhưng không. –
ControlFlow
@ControlFlow: Tôi nghĩ rằng điểm của bạn có ý nghĩa. Có lẽ điều này đã làm một cái gì đó với các giá trị đệ quy mà nói chung là điều khá phức tạp trong F #. –
Tôi nghĩ như vậy quá, xử lý các giá trị đệ quy là nhiệm vụ không tầm thường đối với các ngôn ngữ háo hức như F # ... Có lẽ trình biên dịch chỉ nên hạn chế [] tập quán như thế này. –
ControlFlow