Archivo

Posts Tagged ‘F#’

Libro de F# en línea


Pocos son los recursos que hay para aprender F#, a pesar de que ya estamos en la versión 2.0 del lenguaje. Siguiendo unos twitts, llegué a un enlace que dirige a un libro-tutorial en línea de F#. Ya he leído varios capítulos y está súper, es recomendado ampliamente. Dénle una leída, vale la pena.

Hélo aquí.
F# Survival Guide

Lo voy a poner en la barra de la izquierda, para que nadie se lo pierda.

Tschüss!

Anuncios
Categorías:.NET Framework, F#, Noticias Etiquetas:

Código de navegar estructura de directorios, en F#


Hace unos días escribí un apunte sobre cómo navegar la estructura de directorios. El tema tratado en ese artículo no viene al caso en estos momentos. Sin embargo, dicho apunte terminó en un pequeño codiguillo para mostrar la información de un directorio. Y eso es lo que me gustaría retomar.

Por otro lado, hace tiempo que le he echado un vistazo a F#, la nueva iniciativa de Microsoft para programación funcional. Pero la verdad es que nunca me había metido tanto como ahora. Y dado el inminente lanzamiento de Visual Studio 2010 para la próxima semana, con la oficial liberación de F#, he pensado que es buena idea ir posteando cosas en este lenguaje.

Así, tuve la brillante idea de migrar el código del apunte mencionado a F#. Por supuesto, no soy ningún experto y estoy aprendiendo, así que si por causalidad algún lector experto encuentra algún error, espero sea indulgente conmigo.

He aquí el código.

open System
open System.IO

let queryPath =
    Console.WriteLine("Ingrese un directorio:")
    Console.ReadLine()
    
let getPath (args : string[]) =
    match args.Length with
        | 0 -> args.[0]
        | _ -> queryPath
    
let openDir path =
    let dir = new DirectoryInfo(path)
    match dir.Exists with
    | true -> dir
    | _ ->
        Console.WriteLine("El directorio {0} no existe.", dir.Name)
        Console.WriteLine("¿Desea crearlo? (Y/N)")
        let keyInfo = Console.ReadKey(true)
        if keyInfo.Key = ConsoleKey.Y then
            dir.Create()
            dir.Refresh()
        dir
        
let showDirProperties (dir : DirectoryInfo) =
    match dir.Exists with
    | true ->
        Console.WriteLine("Nombre: {0}", dir.Name);
        Console.WriteLine("Nombre completo: {0}", dir.FullName);
        Console.WriteLine("Directorio padre: {0}", dir.Parent.Name);
        Console.WriteLine("Directorio raíz: {0}", dir.Root.Name);
        Console.WriteLine("Atributos: {0}", dir.Attributes);
        Console.WriteLine("Creado: {0}", dir.CreationTime);
        Console.WriteLine("Leído: {0}", dir.LastAccessTime);
        Console.WriteLine("Modificado: {0}", dir.LastWriteTime);
        ()
    | false -> ()
    dir
    
let showDirContent (dir : DirectoryInfo) =
    match dir.Exists with
    | true ->
        for subdir in dir.GetDirectories() do
            Console.WriteLine("[DIR] {0}", subdir.Name)
        for file in dir.GetFiles() do
            Console.WriteLine("- {0}", file.Name)
        ()
    | false -> ()
    
[<EntryPoint>]
let main (args: string[]) =
            
    getPath args
    |> openDir
    |> showDirProperties
    |> showDirContent
    
    ignore(Console.ReadKey(true))
    0

Funciona el código, ¿OK? Bueno, todavía no sé cómo emular las cláusulas try-catch, pero bueno, no debería dar mucho problema.

Intentaré explicar el código paso a paso.

Nuestra aplicación comienza en la línea 52. La función main lo que hace es una composición de funciones. Primero, ejecuta “getPath”, y el valor que ésta regresa se pasa a la función openDir, quien le pasa su valor de retorno a showDirProperties, y ésta hace lo propio con showDirContent. Digamos que su equivalencia en C# sería:

string getPath(string[] args) { ... }
DirectoryInfo openDir(string path) { ...}
DirectoryInfo showDirProperties(DirectoryInfo dir) { ... }
void showDirContent(DirectoryInfo dir) { ... }

static void Main(string[] args)
{
    showDirContent(
        showDirProperties(
            openDir(
                getPath(args)
            )
        )
    );

    Console.ReadKey(true);
}

Comencemos por revisar getPath. Esta función revisa si el parámetro (un array de cadenas de texto) tiene elementos. De hacerlo, regresa el primer elemento, y si no, obtiene el valor que regresa queryPath, el cual se encarga de obtener un directorio por parte del usuario.

La función openDir toma como parámetro una cadena de texto que representa la ruta del directorio, y devuelve un objeto DirectoryInfo. Si el directorio no existe, se asegura de preguntarle al usuario si desea crearlo, y así lo hace si el usuario lo decide.

Por otra parte, showDirProperties toma como parámetro un objeto DirectoryInfo y muestra las propiedades del directorio, si este existe. Y showDirContent hace un for-in-do (equivalente a un foreach) para imprimir los subdirectorios y los archivos contenidos.

El programa no es muy excitante, lo admito, pero hey, así se empieza: haciendo pequeños programillas.

Categorías:.NET Framework, Cómo hacer, F# Etiquetas: ,