2013-01-11 47 views
5

Tôi vẫn đang đánh giá nếu tôi nên bắt đầu sử dụng D để tạo mẫu mã số trong vật lý.Dd std lib có bao gồm boost.fusion và boost.mpl không?

Một điều khiến tôi dừng lại là tôi thích tăng cường, đặc biệt là phản ứng tổng hợp và mpl.

D là tuyệt vời cho lập trình mẫu meta và tôi nghĩ rằng nó có thể làm mpl và công cụ tổng hợp nhưng tôi muốn đảm bảo.

Thậm chí nếu tôi bắt đầu sử dụng d, tôi sẽ mất một thời gian để đạt đến cấp mpl. Vì vậy, tôi muốn một người nào đó chia sẻ kinh nghiệm của họ.

(bởi mpl i có nghĩa là sử dụng STL cho các mẫu và bởi phản ứng tổng hợp, tôi có nghĩa STL cho tuples.)

một ghi chú trên hiệu suất sẽ được tốt đẹp quá, vì nó rất quan trọng trong mô phỏng vật lý.

+0

Bạn không thực sự cần * lập trình meta metaprogram; D có đánh giá hàm thời gian biên dịch. – Mehrdad

+0

@Mehrdad cho mọi thứ? bạn có thể làm find_if hoặc biến đổi trên các tham số mẫu? –

+0

Không phải cho tất cả mọi thứ (vẫn còn lỗi để được cố định), nhưng đối với khá nhiều thứ. Thật khó để đưa ra một câu trả lời chung chung nhưng nếu bạn có một ví dụ cụ thể xin vui lòng gửi nó và tôi sẽ xem nếu tôi có thể tìm thấy một phiên bản CTFE của nó và cho bạn thấy. – Mehrdad

Trả lời

7

Trong D, phần lớn, lập trình meta chỉ là lập trình. Không cần bất kỳ thư viện nào như boost.mpl

Ví dụ, hãy xem xét độ dài bạn sẽ phải đi đến trong C++ để sắp xếp một dãy số tại thời gian biên dịch. Trong D, bạn chỉ cần làm điều rõ ràng: sử dụng std.algorithm.sort

import std.algorithm; 

int[] sorted(int[] xs) 
{ 
    int[] ys = xs.dup; 
    sort(ys); 
    return ys; 
} 

pragma(msg, sorted([2, 1, 3])); 

này in ra [1, 2, 3] tại thời gian biên dịch. Lưu ý: sort không được tích hợp vào ngôn ngữ và hoàn toàn không có mã đặc biệt để làm việc tại thời gian biên dịch.

Đây là một ví dụ khác xây dựng bảng tra cứu cho chuỗi Fibonacci tại thời gian biên dịch.

int[] fibs(int n) 
{ 
    auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1); 
    int[] ret = new int[n]; 
    copy(fib.take(n), ret); 
    return ret; 
} 

immutable int[] fibLUT = fibs(10).assumeUnique(); 

Ở đây, fibLUT được xây dựng hoàn toàn tại thời gian biên dịch, không cần bất kỳ mã thời gian biên dịch đặc biệt nào.

Nếu bạn muốn làm việc với các loại, có một vài chức năng meta loại trong std.typetuple. Ví dụ:

static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) == 
       TypeTuple!(ubyte, uint, ulong))); 

Thư viện đó, tôi tin rằng, chứa hầu hết các chức năng bạn có thể nhận được từ Fusion. Hãy nhớ rằng mặc dù, bạn thực sự không cần phải sử dụng nhiều mẫu meta-lập trình công cụ trong D nhiều như bạn làm trong C + +, bởi vì hầu hết các ngôn ngữ có sẵn tại thời gian biên dịch anyway.

Tôi thực sự không thể nhận xét về hiệu suất vì tôi không có trải nghiệm rộng lớn với cả hai. Tuy nhiên, bản năng của tôi sẽ là thời gian thực hiện biên dịch của D nhanh hơn vì bạn thường không cần phải thực hiện nhiều mẫu. Tất nhiên, các trình biên dịch C++ đã trưởng thành hơn, vì vậy tôi có thể sai ở đây. Cách duy nhất bạn sẽ thực sự tìm ra là bằng cách thử nó cho trường hợp sử dụng cụ thể của bạn.