【问题标题】:Can you improve this 'lines of code algorithm' in F#?你能在 F# 中改进这种“代码行算法”吗?
【发布时间】:2015-05-03 10:47:03
【问题描述】:

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

脚本的核心是计算空格、cmets 和代码行数的函数。 (请注意,目前它是为 C# 量身定制的,不了解多行 cmets)。

它对我来说看起来不太好 - 有人有更清洁的版本吗?

// 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

【问题讨论】:

    标签: c# algorithm f#


    【解决方案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
    

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

    【讨论】:

    • 嗯,'type Line' 我喜欢,'Classify' 也是。也许我读过太多不可变的东西,但如果可以避免的话,我不太喜欢使用数组……但我确实喜欢你将问题分成更小的部分的方式。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      除了您将带有尾随空格的单个大括号视为代码而不是空格之外,看不出有什么问题。

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 2016-04-15
        • 2010-09-27
        • 2011-04-30
        • 2011-03-18
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多