2012-06-27 18 views
9

Khi lập trình meta C++ hoạt động: có cách nào để làm điều gì đó có thể so sánh được với bất kỳ ngôn ngữ lập trình chức năng nào (ví dụ: Haskell's) hay không?C++/Boost MPL: mã cấu trúc tương tự như vậy Haskell cho phép, ở đâu,

Tôi đang sử dụng Boost :: MPL nhưng muốn có thêm cấu trúc cho các kết nối dài hơn. Chia tách thành nhiều chức năng là tốt nhưng tôi thích cho phép/ở đâu trong một số trường hợp.

+0

Có đến một điểm mà cố gắng bót đi giày nhiều mẫu ma thuật vào C++ ngừng đem lại lợi nhuận rất hữu ích, đặc biệt là khi nói đến khả năng tương thích và bảo trì trong tương lai. Bạn đã cân nhắc viết nhiều mã hơn bằng một ngôn ngữ chức năng nhanh có thể tạo ra các thư viện có thể gọi từ C/C++ không? (OCaml lò xo để tâm trí) – Rook

+1

Không, tôi đã không xem xét điều đó. Tôi đang sử dụng lập trình meta bởi vì tôi cần phải làm một cái gì đó tại thời gian biên dịch, không phải vì tôi muốn viết mã chức năng. Các đoạn mã của tôi không phức tạp lắm. Tôi chỉ nghĩ nếu tôi sử dụng cùng một ứng dụng chức năng ba lần trong một 30-line-metafunction nó sẽ được tốt đẹp để sử dụng một số cấu trúc. – user1034081

+0

Trong C++ 11, bạn có thể thực hiện quá trình biên dịch thời gian với 'constexpr' thay vì các mẫu. – leftaroundabout

Trả lời

2

Bản thân MPL không hỗ trợ các điều khoản let nhưng một số thư viện được xây dựng trên đầu trang. Một ví dụ là metamonad. Như tên cho thấy nó cũng hỗ trợ một số khái niệm chức năng cao cấp khác (monads). Một hạn chế lớn là, metamonad không phải là một phần chính thức của bản phân phối Boost.

Đối với MPL, việc chia nhỏ mọi thứ thành các hàm và sử dụng nhiều không gian tên để nhóm chúng và nhập biểu tượng quan trọng vào không gian tên cấp cao nhất có lẽ là lựa chọn tốt nhất của bạn.

+0

Cảm ơn bạn đã chỉ cho tôi thư viện đó. Có vẻ như những gì tôi đã được tìm kiếm cho độ cao tôi chưa biết, nếu tôi sẽ sử dụng nó. Thêm thư viện, trông giống như ma thuật, ... – user1034081

+1

@ user1034081 Một người dùng MPL phàn nàn về ma thuật;) – pmr

1

Boost.Phoenix có cấu trúc được gọi là let cho phép bạn khai báo biến cục bộ trong ngữ cảnh hàm thứ tự cao hơn. Tôi nghĩ rằng đây là cấp cao như nó được, mặc dù. Nó vẫn là thời gian chạy, không biên dịch.

Từ trang liên kết:

let(_x = 1, _y = ", World") 
[ 
    // _x here is an int: 1 

    let(_x = "Hello") // hides the outer _x 
    [ 
     cout << _x << _y // prints "Hello, World" 
    ] 
] 
+0

Theo ý kiến ​​của tôi, nếu bạn muốn viết mã chức năng, bạn nên dùng một ngôn ngữ chức năng. Tôi chỉ tìm kiếm một cấu trúc cho phép bởi vì siêu lập trình mẫu có chức năng. – user1034081

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