2010-09-10 35 views
10

Tôi hiện đang học D, và một trong những điều tôi tự hỏi là liệu D có cách sao chép các khả năng tạo mã của các ngôn ngữ JVM hay không.Tạo mã thời gian biên dịch trong D

Đây là kịch bản: Tôi có một đối tượng và tôi muốn tạo chuỗi dựa trên đối tượng cung cấp tên và tất cả các trường của nó. Trong Java/Scala, tôi có thể chỉ sử dụng phản chiếu, nhưng giả sử tốc độ là một vấn đề. Tôi có thể sử dụng một thư viện thế hệ bytecode để tự động tạo và biên dịch một lớp thực hiện điều này mà không cần phản ánh. Việc thực hiện sẽ phá vỡ để lặp qua các trường của đối tượng và lấy tên của nó thông qua đệ quy và sử dụng thông tin đó để tự động tạo Java (hoặc bytecode) truy cập trực tiếp vào các trường.

Nếu bạn không thích kịch bản đó vì nó yếu và/hoặc không thực tế, một số khác có thể thực tế hơn là tối ưu hóa đối tượng được tối ưu hóa.

Tôi đã xem các ví dụ về đánh giá thời gian biên dịch và/hoặc lập trình meta mẫu của D cho những thứ như tính toán trước chuỗi mã hóa tại thời gian biên dịch và các thuật toán đệ quy khác, nhưng có cách làm như thế này chỉ với ngôn ngữ và một trình biên dịch, hoặc bạn sẽ cần phát triển một trình tạo mã riêng biệt và chạy nó trước trình biên dịch để có được loại chức năng này?

Trả lời

5

Các kết hợp chuỗi có thể truy cập vào không gian tên mà chúng được trộn vào. Điều đó bao gồm this.tupleof, có thể được sử dụng để lặp lại các trường của một lớp. Một mẫu tuần tự hóa có thể tận dụng điều đó, hoặc buộc người dùng chỉ định các trường để tuần tự hóa bằng tay; I E. class Class : ISerializable { int foo; Forble bar; mixin(genSerialize("foo, bar")); ... }

6

Không chỉ có thể thực hiện việc này, nó thực tế được thực hiện cho bạn trong D2. Tất cả những gì bạn cần là một mixin nhỏ để biến chúng thành các tính năng thời gian biên dịch thành các tính năng thời gian chạy.

  • Đối với tên lớp, tất cả những gì bạn cần làm là đánh giá typeof(this).stringof trong phạm vi của lớp học.

  • Để biết danh sách tất cả các trường, hãy thử __traits(allMembers, typeof(this)) và sau đó lọc ra nội dung không phải là trường (std.traits sẽ hữu ích ở đây).

+0

Vui lòng, bạn có thể xem [this post] (http://stackoverflow.com/questions/11314596/listing-a-classs-methods-trough-mixin) không? – menjaraz

Các vấn đề liên quan