2014-05-10 10 views
10

Piszę (w zasadzie mój pierwszy) duży program w Haskell i próbuję rozbić mój program na moduły, aby łatwiej było go utrzymać. W Haskell nazwy modułów wydają się zależne od struktury katalogów. Jest to całkowicie w porządku, dopóki nie będę musiał osadzić kolejnej warstwy struktury katalogów dla programu. Podam bardzo prosty przykład poniżej:Lepszy sposób wstawiania katalogów w modułach Haskella

Powiedzmy, że zaczynamy od programu Haskell o następującej strukturze katalogów.

  • nazwy w [nawiasach kwadratowych] reprezentują katalogów
  • nazwy w {klamrami} reprezentują moduły,
  • nazwy w (normalnych nawiasach) stanowią nazwy pliku związany wewnątrz modułów
[src] 
    - (Main.hs) {Main} 
    - (PRBS.hs) {PRBS} 
    - [Hardware] 
     - (DataDef.hs) {Hardware.DataDef} 
     - (ShiftRegister.hs) {Hardware.ShiftRegister} 

To wszystko w porządku. Mogę importować wszystko, co chcę, gdzie tylko chcę. Jednak teraz, że chcę, aby utworzyć kolejny poziom abstrakcji, tak:

[src] 
    - (Main.hs) {Main} 
    - [Firmware] 
     - (PRBS.hs) {Firmware.PRBS} 
     - [Hardware] 
      - (DataDef.hs) {Firmware.Hardware.DataDef} 
      - (ShiftRegister.hs) {Firmware.Hardware.ShiftRegister} 

Wskazówka teraz, że nazwy wszystkich modułów w Komputery zmieniły. Muszę teraz zmienić nazwy modułów w każdym pliku i we wszystkich innych plikach, w których pliki są importowane. Trzy pliki, które pokazałem w jednym przykładzie. Jeśli struktura katalogów kończy się setkami plików z dziesiątkami wbudowanych katalogów, może to uniemożliwić utrzymanie kodu. Ponadto, jeśli w którymkolwiek momencie chcę skopiować katalog (i jego podkatalogi w określonym miejscu w bieżącym systemie katalogowym), muszę znaleźć wszystkie poprzednie katalogi, które się przed nim znajdują, i ręcznie zmienić nazwy modułów w każdym z nich. plik.

Ponieważ Haskell jest używany w kilku dużych projektach, jestem pewien, że czegoś tu brakuje. Każda pomoc w wydostaniu mnie z tego bagna będzie bardzo doceniona!

+0

nie wiem narzędzia lub podejścia, które działa wokół tego, ale wygląda na to, że będzie być zabawnym małym programem do pisania, aby zaktualizować nazwy modułów rekursywnie, gdy zmienisz strukturę w ten sposób. – bheklilr

+1

Ha ha, myślę, że twoja definicja _little_ właśnie spowodowała zakłócenie Mocy. – ssm

+3

Dla specyficzności: tak to jest w GHC, ale nie w Haskell jako całości. Specyfikacja nie mówi w ogóle, jak kompilator powinien znaleźć moduły. Podejrzewam, że dobrze zrobiona łata, która rozszerza możliwości wyszukiwania GHC, byłaby akceptowana ... ale pamiętaj, aby poprosić o komentarze przed rozpoczęciem hakowania, ponieważ jest to z pewnością coś, co zostało wcześniej omówione i jest dużo do zapamiętania w dobrym projekt. –

Odpowiedz

1

Jeśli masz Perl i bash i znaleźć i wszystko, co można zrobić coś takiego:

find Firmware/Hardware/ -name '*.hs' -exec perl -i.bak -pe \ 
     's/^module (Hardware\.\S+)/module Firmware.$1/' \ 
     {} \; 
diff Firmware/Hardware/DataRef.hs{,.bak}