Можете ли вы улучшить этот «алгоритм строк кода» в 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

person Benjol    schedule 06.10.2008    source источник


Ответы (3)


Я думаю, что то, что у вас есть, прекрасно, но вот немного разнообразия, чтобы смешать это. (Это решение повторяет вашу проблему с игнорированием завершающих пробелов.)

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

«Классифицировать» как отдельный объект может быть полезен в другом контексте.

person Brian    schedule 06.10.2008
comment
хм, "линия типа" мне нравится, "классифицировать" тоже. Может быть, я читал слишком много неизменяемых вещей, но мне не очень нравится использовать массивы, если я могу этого избежать... но мне нравится, как вы разбили проблему на более мелкие части. - person Benjol; 07.10.2008

Лучшим сайтом для этого может быть refactormycode — он создан именно для этих вопросов.

person Tom Ritter    schedule 06.10.2008

Не вижу ничего плохого в этом, кроме того факта, что вы будете считать одну фигурную скобку с завершающими пробелами кодом, а не пробелом.

person finnw    schedule 06.10.2008