2016-10-19 6 views
5

Szukam lint kodu, kwerendy typu, auto-insert i pomocnika misc do użycia z vim (jak autouzupełnianie).Co jest różne wśród hlint, hdevtools i ghc-mod

Po niektórych badań znalazłem wiele podobnych narzędzi, które migth robić co chcę

  • hlint
  • hdevtools
  • ghc-mod

Głównym pytaniem, Czy to wszystko w zasadzie to samo narzędzie?

Kiedy zrobić kilka testów stwierdziliśmy, że tylko ghc-mod działa out-of-the-box (dla kodu szarpie, havn't spróbować żadnej funkcji typu pomocnika)

$ cat test.hs 
main = putStrLn "test" 
$ ghc-mod check test.hs 
test.hs:1:1:Warning: Top-level binding with no type signature: main :: IO() 
$ hdevtools check test.hs 
Run from outside a project, using implicit global project config 
$ hlint test.hs 
No hints 

Czy muszę utworzyć dowolny plik konfiguracyjny dla hlint i hdevtools?

$ hdevtools --version 
hdevtools: version 0.1.4.1 (ghc-8.0.1-x86_64-linux, cabal-1.24.0.0) 
$ hlint --version 
HLint v1.9.35, (C) Neil Mitchell 2006-2016 
$ ghc-mod --version 
ghc-mod version 5.6.0.0 compiled by GHC 8.0.1 
$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 8.0.1 

Wszystkie narzędzia został zainstalowany przez stack install i mam /home/wizzup/.local/bin w $PATH

Odpowiedz

13

ghc-mod instaluje plik binarny o nazwie ghc-mod do $PATH, która jest w stanie załadować i przesłuchać swoją bazę pakietów oraz kod źródłowy (istnieje również "interaktywna" wersja o nazwie ghc-modi, która wczytuje polecenia ze standardowego wejścia i trzyma się). Do tego celu wykorzystuje interfejsy API GHC i Cabal. Postęp utknął na jakiś czas, ale teraz powrócił do tętniącego życiem państwa. Istnieją pakiety Emacs/Vim/Sublime, które wiedzą, jak rozmawiać z ghc-mod i oferują różne funkcje podobne do IDE dla użytkowników końcowych: typechecking, hole, program/proof search, find-definition.

hdevtools to nowszy projekt zainspirowany wersją ghc-mod. Jest podobna pod względem architektonicznym - działa na trwałym serwerze w tle z pakietami per-editor. Został zaprojektowany, aby całkowicie zastąpić ghc-mod. Różnice między ghc-mod i hdevtools wydają się być filozoficzne. hdevtools ma mniej fantazyjnych cech ghc-mod, ale jest (z mojego doświadczenia) znacznie szybszy. Coś, co wyszło spod pobieżnego spojrzenia na podstawy kodu: hdevtools wydaje się opierać na interfejsie API GHC, aby zaimplementować serwer podobny do GHCi, zdolny do szybkiego przeładowania kodu. Być może to była kluczowa decyzja, aby uzyskać dobry występ? Jestem pewien, że bardzo upraszczam.

hlint jest bardzo różne. To stary, stary projekt (rozpoczęty w 2006 roku przez Neila Mitchella, jednego ze starszych ludzi z Haskell). Jest w stanie wykryć typowe złe nawyki Haskell (np. Używając concat . map zamiast concatMap) i, w niektórych przypadkach, lekko je odreagować. Opiera się na haskell-src-exts, który przetwarza kod Haskella na AST. Wierzę, że hlint nie wymaga nawet pełnego sprawdzenia typu bazy kodu: może on sam przyjrzeć się abstrakcyjnemu drzewu składni, aby zasugerować zmiany i alerty dźwiękowe. Zwykle wybierzesz: ghc-mod lub hdevtools i użyjesz ich w koniunkcji z hlint, aby uzyskać pełne doświadczenie z Haskell IDE.

Powinniśmy poświęcić trochę czasu na wspomnienie projektu FP Complete o numerze intero, który działa na ghci i jest podobny do hdevtools. Działa tylko wtedy, gdy twoim edytorem jest Emacs i używasz stosu.Nie udało mi się znaleźć dobrej dokumentacji na temat tego, jak różni się ona od ghc-mod lub hdevtools; zakłada się, że ma to na celu dać użytkownikom Emacsa lepsze wrażenia, ponieważ często można dostać się do sytuacji, w której hdevtools/ghc-mod uparcie odmawia uruchomienia z powodu kompilatora lub niedopasowania pakietu edytora. Dzięki intero możesz zacząć pracę z małym fragmentem Elisp.

To wielki stary bałagan!