Tôi đã suy nghĩ về việc tạo ra một thứ gì đó giống như Linq cho Lua, và tôi có một ý tưởng chung về cách Linq hoạt động, nhưng đã tự hỏi liệu có một bài viết hay không hoặc liệu ai đó có thể giải thích cách C# làm cho LINQ có thể làm được không? đằng sau hậu trường, giống như cách nó tạo ra các ràng buộc mã và tất cả điều đó, chứ không phải cú pháp người dùng cuối.Linq hoạt động như thế nào (phía sau hậu trường)?
Trả lời
Thật khó để trả lời câu hỏi vì LINQ là rất nhiều điều khác nhau. Ví dụ: gắn bó với C#, những điều sau đây có liên quan:
- Biểu thức truy vấn được "xử lý trước" thành "C# không có biểu thức truy vấn", sau đó được biên dịch bình thường. Phần biểu thức truy vấn của spec là thực sự ngắn - về cơ bản nó là một bản dịch cơ khí mà không giả định bất cứ điều gì về ý nghĩa thực sự của truy vấn, ngoài "thứ tự bởi được dịch sang OrderBy/ThenBy/etc".
- Đại biểu được sử dụng để đại diện cho các hành động tùy ý có chữ ký cụ thể, dưới dạng mã thực thi.
- Cây biểu thức được sử dụng để đại diện cho cùng một điều, nhưng dưới dạng dữ liệu (có thể được kiểm tra và dịch sang dạng khác, ví dụ: SQL)
- Biểu thức Lambda được sử dụng để chuyển đổi mã nguồn thành đại biểu hoặc cây biểu thức.
- Phương thức mở rộng được hầu hết các nhà cung cấp LINQ sử dụng để kết hợp các cuộc gọi phương thức tĩnh với nhau. Điều này cho phép một giao diện đơn giản (ví dụ:
IEnumerable<T>
) để đạt được hiệu quả nhiều năng lượng hơn. - Các loại vô danh được sử dụng cho các phép chiếu - nơi bạn có một số tập hợp dữ liệu khác nhau và bạn muốn bit của mỗi khía cạnh của dữ liệu đó, một loại ẩn danh cho phép bạn tập hợp chúng lại với nhau.
- Biến cục bộ được nhập hoàn toàn (
var
) được sử dụng chủ yếu khi làm việc với các loại ẩn danh, để duy trì ngôn ngữ được nhập tĩnh, trong đó bạn không thể "nói" tên của loại đó một cách rõ ràng. - Khối Iterator thường được sử dụng để triển khai truy vấn trong quá trình, ví dụ: cho LINQ to Objects.
- Suy luận kiểu được sử dụng để làm cho toàn bộ điều mượt mà hơn rất nhiều - có rất nhiều phương pháp chung trong LINQ, và không có suy luận kiểu nó sẽ thực sự đau đớn.
- thế hệ Mã được sử dụng để biến một mô hình (ví dụ DBML) vào mã
- loại phần được sử dụng để cung cấp khả năng mở rộng để mã được tạo
- Thuộc tính được sử dụng để cung cấp siêu dữ liệu để các nhà cung cấp LINQ
Rõ ràng là một rất nhiều trong số này không phải là chỉ được LINQ sử dụng, nhưng các công nghệ LINQ khác nhau sẽ phụ thuộc vào chúng.
Nếu bạn có thể cung cấp thêm chỉ dẫn về các khía cạnh bạn quan tâm, chúng tôi có thể cung cấp thêm chi tiết.
Nếu bạn quan tâm đến việc triển khai LINQ to Objects một cách hiệu quả, bạn có thể quan tâm đến một cuộc nói chuyện mà tôi đã cung cấp ở DDD trong Reading một vài tuần trước - về cơ bản triển khai càng nhiều LINQ to Objects càng tốt trong một giờ. Chúng tôi đã xa hoàn thành vào cuối của nó, nhưng nó nên cung cấp cho một ý tưởng khá tốt của loại của điều bạn cần làm (và đệm/streaming, lặp khối, dịch biểu hiện truy vấn vv). Các video chưa lên (và tôi chưa đưa mã lên để tải xuống) nhưng nếu bạn quan tâm, hãy gửi thư cho tôi theo địa chỉ [email protected] và tôi sẽ cho bạn biết khi nào họ đăng ký . (Tôi cũng có thể sẽ viết blog về nó.)
Rất nhiều thứ và thậm chí bạn không thực sự đi vào bên thi hành. Thậm chí nhiều chi tiết lông sống ở đó. – JaredPar
Vâng một ngày, nếu thời gian cho phép nó sẽ là tuyệt vời để có một hệ thống LINQ đầy đủ cho Lua, nhưng bạn đề cập đến toàn bộ điều rất phức tạp, cho thời điểm tôi đang nghĩ về bắt đầu với trái cây thấp và làm việc của tôi đường lên. –
Tôi không quen với LUA, nó có hỗ trợ trình vòng lặp không? Đó thực sự là nền tảng mà trên đó hầu hết LINQ được xây dựng – JaredPar
Mono (một phần?) Triển khai LINQ và là mã nguồn mở. Có lẽ bạn có thể xem xét triển khai của họ?
nghe có vẻ như một khởi đầu tốt –
Đọc bài viết này:
Có lẽ LINQ for R6RS Scheme của tôi sẽ cung cấp một số thông tin chi tiết.
Nó là 100% ngữ nghĩa, và gần như 100% cú pháp giống như LINQ, với ngoại lệ được chú ý của các tham số sắp xếp bổ sung bằng cách sử dụng 'then' thay vì ','.
Một số quy tắc/giả định:
- Chỉ đối phó với các danh sách, không có nhà cung cấp truy vấn.
- Không lười biếng, nhưng dễ hiểu.
- Không có loại tĩnh nào, vì Chương trình không sử dụng chúng.
thực hiện của tôi phụ thuộc vào một vài thủ tục cốt lõi:
- bản đồ - sử dụng cho 'Chọn'
- lọc - được sử dụng cho 'ở đâu'
- flatten - được sử dụng cho 'SelectMany'
- sắp xếp - quy trình sắp xếp nhiều phím
- nhóm - để nhóm các cấu trúc
Phần còn lại của cấu trúc được xây dựng bằng macro.
Các kết buộc được lưu trữ trong danh sách được gắn thẻ với số nhận dạng bị ràng buộc để đảm bảo vệ sinh. Các ràng buộc được trích xuất và phục hồi tại địa phương mà bao giờ một biểu hiện xảy ra.
Tôi đã theo dõi tiến trình trên blog của mình, có thể cung cấp một số thông tin chi tiết về các vấn đề có thể xảy ra.
Điều này thực sự hữu ích. Cảm ơn –
blog của Matt Warren có tất cả các câu trả lời (và một nhà cung cấp IQueryable mẫu thực hiện để cung cấp cho bạn một headstart):
Đối với ý tưởng thiết kế, hãy nhìn vào c omega, dự án nghiên cứu mà birthed LINQ . Linq là một phiên bản thực tế hơn hoặc được tưới nước của omega c, tùy thuộc vào quan điểm của bạn.
- 1. Typekit hoạt động như thế nào sau hậu trường?
- 2. OrderBy trong LINQ hoạt động như thế nào (sau hậu trường)?
- 3. Đằng sau hậu trường: ORM "suy nghĩ" như thế nào?
- 4. Hoạt động đằng sau hậu trường trên nhắc tải python
- 5. LINQ - nó hoạt động như thế nào?
- 6. LINQ Last() hoạt động như thế nào?
- 7. CMake hoạt động như thế nào?
- 8. Rails đang đăng cú pháp của nó to lên khi nó chạy phía sau hậu trường?
- 9. Trong python, lớp AutoVivification sau hoạt động như thế nào?
- 10. Giải thích tốt về cách thức hoạt động của đường ray đằng sau hậu trường?
- 11. Các trường mô hình Django hoạt động như thế nào?
- 12. ArrayAccess hoạt động như thế nào?
- 13. Cây Suffix hoạt động như thế nào?
- 14. Định nghĩa chức năng sau hoạt động như thế nào?
- 15. Truy vấn Nhóm LINQ Lớn, những gì đang diễn ra đằng sau hậu trường
- 16. RedirectToRouteResult hoạt động như thế nào?
- 17. Làm cách nào tôi có thể tìm hiểu cách bộ chọn jQuery hoạt động sau hậu trường?
- 18. Trình bundler hoạt động như thế nào?
- 19. currentPopoverFromRect hoạt động như thế nào?
- 20. Loại serialization nào sử dụng Wcf đằng sau hậu trường?
- 21. Contract.Ensures hoạt động như thế nào?
- 22. Haskell: TVar hoạt động như thế nào?
- 23. DataReader hoạt động như thế nào?
- 24. IDataErrorInfo hoạt động như thế nào?
- 25. C# Events hoạt động như thế nào?
- 26. MenuItem.SHOW_AS_ACTION_IF_ROOM hoạt động như thế nào?
- 27. Virtualenv hoạt động như thế nào?
- 28. Form.reset() hoạt động như thế nào?
- 29. PHP max_execution_time hoạt động như thế nào?
- 30. delegate.Invoke hoạt động như thế nào?
Bạn có nghĩa là truy vấn được dịch sang cú pháp/cây cơ bản hoặc LINQ hoạt động như thế nào trong ý nghĩa thực thi? – JaredPar
Tôi hầu như lo ngại về các hệ thống biên dịch thời gian –