Я написал небольшой скрипт для перебора файлов в папках для подсчета строк кода.
В основе скрипта лежит функция подсчета строк пробелов, комментариев и кода. (Обратите внимание, что на данный момент он адаптирован для C# и не знает о многострочных комментариях).
Мне это просто не очень приятно - есть ли у кого-нибудь более чистая версия?
// from list of strings return tuple with count of (whitespace, comments, code)
let loc (arr:List<string>) =
let innerloc (whitesp, comment, code) (l:string) =
let s = l.Trim([|' ';'\t'|]) // remove leading whitespace
match s with
| "" -> (whitesp + 1, comment, code) //blank lines
| "{" -> (whitesp + 1, comment, code) //opening blocks
| "}" -> (whitesp + 1, comment, code) //closing blocks
| _ when s.StartsWith("#") -> (whitesp + 1, comment, code) //regions
| _ when s.StartsWith("//") -> (whitesp, comment + 1, code) //comments
| _ -> (whitesp, comment, code + 1)
List.fold_left innerloc (0,0,0) arr





Лучшим сайтом для этого может быть рефакторинг - он предназначен именно для этих вопросов.
В этом нет ничего плохого, кроме того факта, что вы будете считать одну фигурную скобку с пробелами конечный как код вместо пробелов.
Я думаю, что у вас все в порядке, но вот несколько вариантов, чтобы их смешать. (Это решение повторяет вашу проблему игнорирования конечных пробелов.)
type Line =
| Whitespace = 0
| Comment = 1
| Code = 2
let Classify (l:string) =
let s = l.TrimStart([|' ';'\t'|])
match s with
| "" | "{" | "}" -> Line.Whitespace
| _ when s.StartsWith("#") -> Line.Whitespace
| _ when s.StartsWith("//") -> Line.Comment
| _ -> Line.Code
let Loc (arr:list<_>) =
let sums = Array.create 3 0
arr
|> List.iter (fun line ->
let i = Classify line |> int
sums.[i] <- sums.[i] + 1)
sums
«Классифицировать» как отдельную сущность может быть полезно в другом контексте.
хм, мне нравится 'type Line', 'Classify' тоже. Возможно, я прочитал слишком много неизменного, но мне не очень нравится использовать массивы, если я могу этого избежать ... но мне нравится, как вы разбили проблему на более мелкие части.