2012-06-27 11 views
9

Ponieważ metaprogramowanie w C++ jest funkcjonalne: czy jest jakiś sposób na zrobienie czegoś porównywalnego z jakimkolwiek funkcjonalnym językiem programowania (na przykład Haskell's), pozwól lub gdzie się skonstruujesz?C++/Boost MPL: kod struktury podobnie jak Haskella, gdzie,

Używam Boost :: MPL, ale chciałbym mieć więcej struktury dla dłuższych metafunkcji. Dzielenie na kilka funkcji jest w porządku, ale wolę niech/gdzie w niektórych przypadkach.

+0

przychodzi moment, w którym próbuje shoehorn więcej szablonu magię w C++ przestaje dając użytecznych zwrotów, zwłaszcza jeśli chodzi o przyszłą kompatybilność i maintainance. Czy rozważałeś napisanie większej ilości kodu w szybkim języku funkcjonalnym, który może generować biblioteki wywoływane przez C/C++? (OCaml przychodzi mi na myśl) – Rook

+1

Nie, nie zastanawiałem się nad tym. Używam meta-programowania, ponieważ muszę coś zrobić w czasie kompilacji, nie dlatego, że chcę napisać funkcjonalny kod. Moje fragmenty kodu nie są tak skomplikowane. Pomyślałem tylko, że gdybym użył tej samej funkcji aplikacji trzy razy w metafunkcji 30 linii, byłoby miło użyć jakiejś struktury. – user1034081

+0

W C++ 11 można wykonać wiele operacji kompilacji przy użyciu 'constexpr' zamiast szablonów. – leftaroundabout

Odpowiedz

2

Sam MPL nie obsługuje klauzul let, ale niektóre z bibliotek zbudowanych na nim działają. Jednym z przykładów jest metamonad. Jak sama nazwa wskazuje, obsługuje również inne koncepcje funkcjonalne wyższego poziomu (monady). Dużą wadą jest to, że metamonad nie jest oficjalną częścią dystrybucji Boost.

Jeśli chodzi o obejście MPL, podział rzeczy na funkcje i użycie większej ilości przestrzeni nazw w celu ich pogrupowania, a następnie zaimportowanie ważnego symbolu do przestrzeni nazw najwyższego poziomu to prawdopodobnie najlepszy wybór.

+0

Dzięki za skierowanie mnie do tej biblioteki. Wygląda na to, czego szukałem, ale jeszcze nie wiem, jeśli z niego skorzystam. Dodatkowa biblioteka, wygląda jak magia, ... – user1034081

+1

@ user1034081 Użytkownik MPL narzekający na magię;) – pmr

1

Boost.Phoenix ma konstrukcję o nazwie let, która pozwala zadeklarować zmienne lokalne w kontekście funkcji wyższego rzędu. Myślę, że jest to tak wysoki poziom, jak to tylko możliwe. To wciąż środowisko wykonawcze, a nie kompilacja.

Od połączonej strony:

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

Moim zdaniem, jeśli chcesz napisać funkcjonalny kod, powinieneś wziąć język funkcjonalny. Szukam tylko let-construct, ponieważ metaprogramowanie szablonów jest funkcjonalne. – user1034081

Powiązane problemy