programación - libro de ejercicios resueltos en c#
¿Puedes mejorar estas ''líneas de algoritmo de código'' en F#? (3)
Creo que lo que tienes está bien, pero aquí hay algo de variedad para mezclarlo. (Esta solución repite su problema de ignorar los espacios en blanco al final).
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
"Clasificar" como una entidad separada podría ser útil en otro contexto.
He escrito una pequeña secuencia de comandos para iterar a través de los archivos en las carpetas para contar las líneas de código.
El corazón del script es esta función para contar las líneas de espacios en blanco, comentarios y código. (Tenga en cuenta que, por el momento, está diseñado para C # y no conoce los comentarios de varias líneas).
Simplemente no se ve muy bien para mí, ¿alguien tiene una versión más limpia?
// 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
No se puede ver mucho mal con eso, aparte del hecho de que se contará un solo corsé con espacios finales como código en lugar de espacios en blanco.
Un mejor sitio para esto podría ser refactormycode : está diseñado exactamente para estas preguntas.