... | ... | @@ -3,6 +3,8 @@ |
|
|
Alle Teile des Ausgabestrings werden bei **hlint** durch **:** anstelle von **,** getrennt.
|
|
|
Ebenfalls wird die im [LINT Basisformat](lint basisformat) noch optionale Zeichennummer immer ausgegeben.
|
|
|
|
|
|
**hlint** kann von verschiedenen Editoren verwendet werden. Genauer werden vorerst [Emacs](https://www.gnu.org/software/emacs/) und [Atom](https://atom.io) betrachtet. Für Atom liegt ein [Plugin](https://github.com/AtomLinter/linter-hlint) vor. Emacs nutzt eine Zwischenschicht, namens [flycheck](https://github.com/flycheck/flycheck), welche dann unter anderem hlint aufrufen kann.
|
|
|
|
|
|
## Nachrichtenklassen
|
|
|
**hlint** implementiert nicht alle Nachrichtenklassen des [LINT Basisformat](lint basisformat). Es werden lediglich Error, Suggestion und Warning verwendet.
|
|
|
|
... | ... | @@ -16,13 +18,59 @@ Ebenfalls wird die im [LINT Basisformat](lint basisformat) noch optionale Zeiche |
|
|
|
|
|
Im folgenden Programm befindet sich ein Tippfehler in der Typsignatur.
|
|
|
|
|
|
```{.haskell}
|
|
|
```haskell
|
|
|
test :: [[a]] ->
|
|
|
test s = concat $ map id s
|
|
|
```
|
|
|
|
|
|
![Test2](/uploads/f244e21bbabbdb4d21237f9ca5537023/Test2.jpeg)
|
|
|
Die Ausgabe auf der Konsole liefert, dass in der zweiten Zeile an erster Stelle ein Parsingfehler unterlaufen ist.
|
|
|
![Test2](/uploads/4ad17da78d5558df1e3cc54b36d62f20/Test2.jpeg)
|
|
|
Je nachdem welche Konsole verwendet wird, wird die Ausgabe bereits eingefärbt, sodass das Lesen des defekten Codestücks erleichtert wird.
|
|
|
|
|
|
**Warnung bei Optimierungsvorschlägen**
|
|
|
Korrigiert man das vorher gezeigte Programm, so erhält man das folgende Codestück.
|
|
|
|
|
|
```haskell
|
|
|
test :: [[a]] -> [a]
|
|
|
test s = concat $ map id s
|
|
|
```
|
|
|
|
|
|
Wird hierauf das Linter angewendet, so werden Warnungen bzgl möglicher Optimierung ausgegeben.
|
|
|
|
|
|
![Test1](/uploads/a0a7376b6a41bc1ce3a3134f3dbfcc6f/Test1.jpeg)
|
|
|
|
|
|
Es wird vorgeschlagen, dass das Vorkommen *concat $ map* in *concatMap* überführt werden sollte.
|
|
|
Ebenfalls wird vor der Verwendung der Funktion *id* als Parameter von *map* gewarnt.
|
|
|
Es wird vorgeschlagen die Funktion *id* anstelle des Terms *map id* zu verwenden.
|
|
|
|
|
|
Es können ebenfalls mögliche Eta-Reduktionen erkannt werden. Dies ist zu sehen, wenn die vorher gemeldeten Verbesserungsvorschläge in den Quelltext übernommen werden und der Linter ein weiteres Mal ausgeführt wird.
|
|
|
|
|
|
![Test4](/uploads/83b82a4cb22d2669597389b227e0670c/Test4.jpeg)
|
|
|
|
|
|
**Suggestion für verbesserte Les- und Wartbarkeit**
|
|
|
|
|
|
Werden unübersichtliche Codekonstrukte erkannt, so werden Verbesserungsvorschläge ausgegeben. In dem folgenden Beispiel wird das erste Element einer Liste mittels Zugriffsoperator ausgegeben.
|
|
|
|
|
|
```haskell
|
|
|
my head l = l !! 0
|
|
|
```
|
|
|
|
|
|
hlint meldet hierzu, dass die Funktion *head* verwendet werden soll.
|
|
|
|
|
|
![Test3](/uploads/ed09b6770239e7cce3f73cafcf4cd73a/Test3.jpeg)
|
|
|
|
|
|
Durch die Verwendung von 'head' wird die Lesbarkeit und somit auch die Wartbarkeit verbessert. Dies wird besonders deutlich, wenn der Operator *!!* noch weiter verschachtelt vorliegt.
|
|
|
|
|
|
```haskell
|
|
|
concatMap (\i -> [i !! 0])
|
|
|
---
|
|
|
concatMap (\i -> [head i])
|
|
|
```
|
|
|
|
|
|
## Verwendbarkeit im Kontext von Dr. Haskell
|
|
|
|
|
|
![Test1](/uploads/09456097c3a8f989da7a64ba2c60ae16/Test1.jpeg)
|
|
|
Da **hlint** bereits von vielen Editoren eingebunden werden kann, könnte zu Testzwecken der Verwais auf hlint auf die Dr. Haskell Implementierung geändert werden.
|
|
|
Hierbei wäre die Festlegung der Sprachlevel vorerst auf die Konfiguration des Plugins festgelegt.
|
|
|
Eine Lösung für dieses Problem wäre, dass man die Sprachlevel auch direkt im Quelltext des zu parsenden Programms hinterlegen könnte, also vor dem Lintvorgang nach einem gültigen Sprachlevelidentifier gesucht wird wenn kein Sprachlevel als Parameter übergeben wurde.
|
|
|
|
|
|
![Test3](/uploads/93e061f1c3d226022f46f844186c4ee2/Test3.jpeg) |
|
|
\ No newline at end of file |
|
|
Ebenfalls bleibt zu überlegen, ob nicht standardmäßig einige Meldungen aus hlint übernommen werden sollten. Hilfreich wären beispielsweise die Suggestions. |
|
|
\ No newline at end of file |