Можете ли вы улучшить эти "строки алгоритма кода" в F #?
Я написал немного script для перебора файлов в папках для подсчета строк кода.
Сердцем script является эта функция для подсчета строк пробелов, комментариев и кода. (Обратите внимание, что на данный момент он настроен на С# и не знает о многострочных комментариях).
Это просто не очень приятно для меня - есть ли у кого чистая версия?
// 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
Ответы
Ответ 1
Я думаю, что у вас все хорошо, но здесь есть несколько разновидностей, чтобы их смешивать. (Это решение повторяет вашу проблему игнорирования конечного пробела.)
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
"Классифицировать" как отдельный объект может быть полезным в другом контексте.
Ответ 2
Лучшим сайтом для этого может быть refactormycode - он специально предназначен для этих вопросов.
Ответ 3
Невозможно увидеть много ошибок, кроме того, что вы считаете одну скобку с конечными пробелами как код вместо пробела.