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

时间:2008-10-06 14:06:25

标签: c# algorithm f#

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

脚本的核心是这个函数来计算空格,注释和代码的行。 (请注意,目前它是针对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

3 个答案:

答案 0 :(得分:2)

我认为你所拥有的一切都很好,但这里有一些混合起来。 (此解决方案重复了忽略尾随空格的问题。)

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

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

答案 1 :(得分:1)

更好的网站可能是refactormycode - 它是针对这些问题量身定制的。

答案 2 :(得分:0)

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