你能改进F#中的’代码行算法’吗?

我编写了一个小脚本来迭代文件夹中的文件以计算代码行数。

脚本的核心是这个函数来计算空格,注释和代码的行。 (请注意,目前它是针对C#量身定制的,并且不了解多行注释)。

它对我来说看起来不是很好 – 有没有人有更清洁的版本?

// from list of strings return tuple with count of (whitespace, comments, code) let loc (arr:List) = 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 

“分类”作为单独的实体可能在另一个上下文中有用。

一个更好的网站可能是refactormycode – 它专门针对这些问题量身定制。

除了你将计算带有尾随空格作为代码而不是空格的单个大括号这一事实之外,看不出太多错误。