Archive for the '8848' Category

Presentando Programación Funcional, AjLisp y Clojure

Friday, November 5th, 2010

Ayer, Jueves 4 de Noviembre, tuve el placer de compartir una charla con @MartinSalias y @RodolfoF, sobre Programación Funcional. La dimos como una charla del nuevo emprendimiento de Martin:

http://www.codeandbeyond.org/

El lugar fue las instalaciones de @Southworks, donde tuvimos proyector, sillas, sonido, y catering (incluyendo cervezas!! ;-). El evento quedó grabado, así que esperamos que Martín lo publique.

Un resumen de lo que dieron Martín y Rodolfo: Martín presentó Programación Funcional en general, comentando sobre Cálculo Lambda, Lisp y la historia de los lenguajes de programación funcional, como ML, Caml, F# y otros. Luego me tocó mi turno, más abajo doy detalles. Tercer parte, de nuevo Martín mostrando F#, y finalmente, Rodolfo mostrando que C# desde el principio es funcional, y dando ejemplos de código procedural vs funcional.

No desesperen, entonces, que todo quedará disponible para verlo en línea.

Mientras, en este post, quería dejar enlaces y comentarios breves de mi intervención en la charla.

Primero, la primera parte presentación se basó en una que ya había dado para @southworks: LambdaPresentation.pptx.

La presentación de ayer en LispClojure.pptx (no es gran cosa, más que algunos enlaces, tiene varios slides en blanco, ver las notas, donde hay código de ejemplo).

Mostré código de cálculo lambda de mi proyecto AjLambda:

Presenting AjLambda: Lambda Calculus Implementation in C#
Presentando AjLambda: implementación de Cálculo Lambda en C#

Si quieren conocer sobre cálculo lambda, desde las matemáticas y lógica, dejé historia y enlaces que usé en

Notas sobre Cálculo Lambda

Trabajé unos minutos mostrando Lambdas en AjLisp. Posts sobre el proyecto AjLisp. Ahí van a encontrar otras implementaciones, como AjScheme, y un AjSharpure, (Work in Progress).

La parte de Clojure la basé en la más larga, detallada y excelente charla de @unclebob:

Uncle Bob Martin’s "Clojure – Up Close and Personal"

Usé el ejemplo de multithreading en Clojure con transacciones en memoria:

https://github.com/sfraser/MultithreadedGameOfLife

Hace ya unos años, escribí sobre Recursos de F# y Programación Funcional.

Mis posts sobre F#
Mis posts sobre Programación Funcional

Mis enlaces:

http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/lisp
http://delicious.com/ajlopez/f#
http://delicious.com/ajlopez/clojure
http://delicious.com/ajlopez/monads
http://delicious.com/ajlopez/lambda
http://delicious.com/ajlopez/scheme

Para los que les interesa Lisp, les recomiendo el libro y más:

Structure and Interpretation of Computer Programs
Video Lectures by Hal Abelson and Gerald Jay Sussman
Structure and Interpretation of Computer Programs adapted for the Clojure programming language
http://delicious.com/ajlopez/sicp

Algo más matemático, que mencioné al pasar:

http://delicious.com/ajlopez/categorytheory
http://www.delicious.com/ajlopez/grothendieck
Alexander Grothendieck
Nicolas Bourbaki

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Recursos de F# y Programación Funcional

Saturday, October 11th, 2008

F# es un lenguaje funcional, creado por Microsoft. Implementado bajo el soporte de .NET CLR, es un lenguaje tipado, con acceso completo al framework de .NET. Hereda características de los lenguajes ML/OCaml, notablemente de este último, el soporte de clases y objetos.

F# nació dentro de Microsoft Research, siendo su principal creador Don Syme. Aunque es un lenguaje funciona, soporta programación de objetos, y no vive en solitario: puede llamarse desde otros lenguajes .NET y puede invocar a librerías escritas en otros lenguajes, lo cual le da una flexibilidad que otros lenguajes más “puros” no tiene. Despues de años de desarrollo, es un lenguaje maduro, que está ganando momento en la comunidad científica, y en otras, como la financiera, que necesitan manipular monedos y operar con fórmulas. Como puede acceder a todo .NET, puede aprovechar otras librerías, como muestra esta imagen, de un programa de demostración que viene en el paquete, donde F# accesde a DirectX desde .NET.

Cito algo de la promoción de Apress sobre el libro Expert F#:

While inspired by OCaml, F# isn’t just another functional programming language. Drawing on many of the strengths of both OCaml and .NET, it’s a general–purpose language ideal for real–world development. F# integrates functional, imperative, and object–oriented programming styles so you can flexibly and elegantly solve programming problems, and brings .NET development alive with interactive execution. Whatever your background, you’ll find that F# is easy to learn, fun to use, and extraordinarily powerful. F# will help change the way you think about and go about programming.

Hay abundante información sobre el lenguaje. Este posts es una actualización de uno anterior, con enlaces, blogs, posts, recursos, libros, sobre este interesante lenguaje. Ya había publicado a fines del año pasado:

Recursos de F#

Enlaces

La primera página a visitar es la página madre de F# en Microsoft:

Microsoft Research’s website for F#
F# Manual
F# Documentation

Hay blogs y foros en
hubFS- The place for F# – F# news, forums and blogs

Blogs personales de gente dedicada a F#:
Don Syme’s web log, a key source of information on F#
Robert Pickering’s blog
Tomas Petricek
Granville Barnett’s blog
Luke Hoban’s blog
Chris Smith (F# Tester)
Brian McNamara (F# Dev)
Jomo Fisher (F# Dev)
Andrew Kennedy (MSR)
Luca Bolognese (Managed Languages Principal PM)

Harry Pierson ha escrito varios posts sobre programación funcional, no solo para F#, abarca también F#:
DevHawk Functional Programming category

Posts y podcasts

Algunos enlaces a posts (hay cientos en los enlaces de arriba), sólo para que tengan un primer encuentro con el lenguaje y su poder expresivo:

Episode 18- Matt Podwysocki on F# and Functional Programming Herding Code
Matt Podwysocki pone “fun” en programación “fun”cional, con F#.

Concurrency on a single thread
Usando expresiones F# asincrónicamente para escribir programas paralelos.

F# September 2008 CTP Released
El último “release” CTP de septiembre. 

F# Overview (I.) – Introduction Articles TomasP.Net

Functional Understanding

Practical F# Parsing- The Parse Buffer

Play Ball Script in F#

Units of Measure in F#- Part One, Introducing Units

The Weekly Source Code 34 – The Rise of F#

Para escuchar

Herding Code 18- Matthew Podwysocki on F# and Functional Programming
Software Engineering Radio Episode 108 – Simon Peyton Jones on Functional Programming and Haskel
.NET Rocks Episode 310 – Simon Peyton Jones on Functional Programming and Haskell

Ejemplos

Además de los ejemplos que vienen con el paquete de distribución, encontraran código para bajarse y probar en lás páginas de los libros mencionados más abajo. Además, tenemos:

F# Samples – Home
Ant Colony Simulation
FsTest
FsUnit

Libros de F#

Estoy leyendo los dos primeros, publico acá algo del resumen publicado por las editoriales para promocionarlos:

  Foundations of F#

Every professional .NET programmer needs to learn about FP, and there’s no better way to do it than by learning F#–and no easier way to learn F# than from Foundations of F#. Written by F# evangelist Rob Pickering, this is an elegant, comprehensive introduction to all aspects of the language and an incisive guide to using F# for real-world professional development.

by Robert Pickering | ISBN-13: 978-1-59059-757-6 | Published May 2007 | 360pp.

 

 Expert F#

Written by F#’s inventor and two major contributors to its development, Expert F# is the authoritative, comprehensive, and in–depth guide to the language and its use. Designed to help others become experts, the first part of the book quickly yet carefully describes the F# language. The second part then carefully shows how to use F# elegantly for a wide variety of practical programming tasks.

by Don Syme, Adam Granicz, Antonio Cisternino | ISBN-13: 978-1-59059-850-4 | Published Dec 2007 | 609pp.

Otro libro, de Jon Harrop: 

F# for Scientists

F# for Scientists will bring you up to speed with basic syntax and programming language concepts. Written in a clear and concise style with practical and enlightening examples, this book is accessible and easy to understand. By reviewing the Visual Studio screen shots that illustrate compilation, debugging and interactive use, you will understand both the functional aspects of F# and the object-oriented task-based features that make F# so useful in practice.

Programación Funcional

Si estamos interesados en la programación funcional en general, podemos visitar:

Functional Programming for the Rest of Us

Why Functional Programming Matters un clásico de John Hughes

Why Haskell Matters

El “paper” clásico de Backus backus.pdf. Backus fue el que puso de nuevo en el tapete a la programación funcional. Recuerdo mis tiempos de “jugar” con APL (A Programming Language).

Un “popurri” de enlaces:

Are FP and OO Incompatible Syntactic Styles-
A Gentle Introduction to Haskell, Version 98
About Erlang
APL (programming language) (uno de los primeros lenguajes con los que me topé)
An APL Compiler (Timothy Budd no deja de escribir libros sobre implementación de lenguajes)
The Cat Programming Language (Gracias a Rodolfo Finochietti por comentarme este lenguaje)
YouTube – Tangible Functional Programming
Functional Programming Notables #1 (más enlaces a programación funcional)
The Little MLer
functional objects Felleisen
Erlang in Lisp
Free Online Functional Programming Books — FreeTechBooks.com
The Expression Lemma (muy math geek, teoría de categorías, programación funcional y LINQ!! Ideal para internarse una semana)
Chaitin’s construction (también math-geeky, más teoría de categorías, Chaitin es argentino, como el mate)
On being stateful
The Glasgow Haskell Compiler
A Neighborhood of Infinity- You Could Have Invented Monads! (And Maybe
InfoQ- Domain Specific Languages in Erlang

C# Funcional

.NET y C# van adoptando con el tiempo algunos estilos funcionales. Todo lo que siempre quiso saber sobre programación funcional con C#, desde el post del bueno de Mattew Podwysocki:

Richmond Code Camp 2008.2 – Functional C# Recap

Otros enlaces:

Functional C# Project
Is C# Becoming a Functional Language- – Mads Torgersen
Functional C# – Learn from F# and LINQ

Mi Delicious

Soy un adicto a Delicious, acá están los tags que uso para estos temas:

http://delicious.com/ajlopez/fsharp
http://delicious.com/ajlopez/f%23
http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/haskell
http://delicious.com/ajlopez/erlang

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
http://delicious.com/ajlopez

Closures en F#

Saturday, August 23rd, 2008

En mi anterior post sobre F#:

Primeros pasos en F#

había mencionado que no hay variables en el lenguaje, que hay identificadores. ¿cómo es eso? Exploremos el concepto de closure (podría traducirlo cierre, cerramiento, clausura), y cómo se usa en F# (closure es una característica de varios lenguajes).

De acuerdo al artículo de la Wikipedia sobre closures en ciencias de la computación:

a closure is a function that is evaluated in an environment containing one or more bound variables
(una closure es una función que es evaluada en un ambiente que contiene uno o más variables ligadas)

Bueno, ¿qué significa esto? Para entenderlo, asignemos un valor a un identificador, usando el fsi.exe, el intérprete interactivo de F# (podríamos usar Visual Studio también):

MSR F# Interactive, (c) Microsoft Corporation, All Rights Reserved
F# Version 1.9.3.4, compiling for .NET Framework Version v2.0.50727

NOTE:
NOTE: See ‘fsi –help’ for flags
NOTE:
NOTE: Commands: #r <string>; reference (dynamically load) the given DLL.
NOTE: #I <string>; add the given search path for referenced DLLs.

NOTE: #use <string>; accept input from the given file.
NOTE: #load <string> …<string>;
NOTE: load the given file(s) as a compilation unit.
NOTE: #time;; toggle timing on/off.
NOTE: #types;; toggle display of types on/off.
NOTE: #quit;; exit.
NOTE:
NOTE: Visit the F# website at
http://research.microsoft.com/fsharp.
NOTE: Bug reports to fsbugs@microsoft.com. Enjoy!

> let x = 2;;

val x : int

Ahora, tenemos un identificador x. Podemos mostrar su valor con:

> x;;
val it : int = 2

Un simple y conocido entero. Ahora, no podemos cambiar su valor: este identificador fue escrito en piedra como que es el entero 2. Nada en la historia humana y de F# podría cambiar sy valor. ¿Será así? Definamos una función:

> let dup n = n * x;;

val dup : int -> int

Esta función dup toma un argumento n y lo multiplica por el valor del identificador x. Este identificador es una “variable” libre en la función: no es un identificador local, viene de afuera de ella. Durante la evaluación de la función, x toma su valor del “environment”, del ambiente en el que estaba durante la definición de dup. Probemos ahora:

> dup 3;;
val it : int = 6

El resultado fue seis, como esperábamos. Pero ahora, veamos de “cambiar” el valor de x:

> let x = 3;;

val x : int

> x;;
val it : int = 3

En este punto, tenemos que comenzar a hablar de closures: este “x” es OTRO identificador, que oculta el anterior. PERO, para la función dup, el identificador x es TODAVIA el anterior. Veamos de comprobar esto, invocando de nuevo la función:

> dup 3;;
val it : int = 6

¡¡El dup todavía usa el x original!! Aquí está la closure en acción. Si intentamos:

> dup;;
val it : (int -> int) = <fun:clo@0>

Notemos el clo @ 0 : es la firma de la closure que esta función está usando. Apunta al ambiente original donde la función había sido definida.

Esta característica implica que la conducta de una función no cambia luego de su definición. Aún las aparentemente “variables libres” están ligadas en tiempo de definición. Toto esto es parte de los fundamentos sólidos de la programación funcional, en general, y de F#, en particular.

Sobre closures en general y conceptos relacionados, como los lambdas, tenemos para leer a:

The Original ‘Lambda Papers’ by Guy Steele and Gerald Sussman

Podemos aprender mucho de Lisp, lambdas y closures, viendo:

Closures + Lambda = The key to OOP in Lisp « Learning Lisp

Implementé algunas lambdas y closures, en mi intérprete Lisp:

AjLisp: a Lisp interpreter in .NET

Más sobre closures y C# en:

What’s In A Closure?
Fibonacci Numbers, Caching and Closures

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com

Recursos de F#

Friday, December 7th, 2007

Quisiera comentar hoy algunos recursos en la web sobre el lenguaje F#, implementación de programación funcional de Microsoft, y sobre programación funcional en general.

F# es un lenguaje nacido en Microsoft Research, de la mano de Don Syme. Pero no es un lenguaje funcional, sino multiparadigma: permite también manejar objetos y todo el framework de .NET. Esto es lo que creo que hará que F# despegue como lenguaje: de hecho ya está siendo usado en muchas partes, donde se necesitan sus capacidades funcionales, pero también se necesitan integrar con tecnologías existentes. (la imagen de este “post” es de un ejemplo animado incluido con F#, usando DirectX).

Enlaces

El sitio padre de F# es el de Research de Microsoft:

Microsoft Research’s website for F#

F# Manual

hubFS: The place for F# – F# news, forums and blogs

Don Syme’s web log, a key source of information on F#

F# Wiki

FSharp Community

Robert Pickering’s Strange Blog

Hay un proyecto en CodePlex, donde hay ejemplos adicionales a los que vienen con la propia instalación de F#:

F# Samples – Home

Gran parte de estos enlaces aparecen desde la página madre (el primer enlace) de F#, pero también estan en la informativa página de Wikipedia:

http://en.wikipedia.org/wiki/F_Sharp_programming_language

Hay un artículo de S. Somasegar (VP de la Developer Division de Microsoft) dando un espaldarazo al proyecto, para integrarlo completamente a las herramientas de desarrollo:

F# – A functional Programming Language

En una charla que di hoy en Microsoft de Argentina, me “inspiré” en una presentación de Tomáš Petříček (http://www.tomasp.net), la pueden bajar de:

FSharp Files: Public Presentations

Es el autor de una introducción a F#:

My F# Notes : F# Overview – Introduction to the F# language

Como curiosidad, como leyeron en recientes post, estoy estudiando sobre Grid Computing y ejecución en paralelo. Vean lo que trae F#:

Introducing F# Asynchronous Workflows

Finalmente, sigo coleccionando enlace en:

http://del.icio.us/ajlopez/f%23

Programación funcional

Sobre programación funcional me pareció muy interesante como introducción:

Functional Programming for the Rest of Us

Hay un “paper” clásico de John Hughes:

Why Functional Programming Matters

Y luego, el clásico del bueno de Backus:

backus.pdf

Mis enlaces adicionales en:

http://del.icio.us/ajlopez/fp

Libros de F#

Hay dos libros publicados de Apress:

Foundations of F# del bueno de Robert Pickering

Expert F# del “Padrino de F#”, Don “Corleone” Syme, Adam Granicz y Antonio Cisternino

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

Primeros pasos en F#

Monday, December 3rd, 2007

Veremos en este post la instalación de F#, el lenguaje funcional de Microsoft, y los primeros comandos que podemos ejecutar. Dejaremos para más adelante el tratamiento de programación funcional en general, el uso de F# desde el Visual Studio, y el compilador que contiene.

El lenguaje F# se viene desarrollando desde hace años, de la mano de su creador Don Syme y sus colaboradores. Pueden ver el sitio de F# en:

http://research.microsoft.com/fsharp/fsharp.aspx

Ahí leemos:

Combining the efficiency, scripting, strong typing and productivity of ML with the stability, libraries, cross-language working and tools of .NET.

F# is a programming language that provides the much sought-after combination of type safety, performance and scripting, with all the advantages of running on a high-quality, well-supported modern runtime system.

No he visto que en esa página actualmente tengan publicado la última distribución, usaré en esta prueba la versión que se publicó hace unos días:

F# 1.9.3.4 download

El enlace me lo pasó el bueno de Paulo Arancibia.

Instalando F#

Los programas de soporte se instalan desde un .msi. Algunas pantallas de instalación:

 

 

El último paso puede tardar varios minutos. Vean que instala soporte de F# en el propio Visual Studio. Yo estoy usando el VS 2005 Professional. F# tiene soporte de VS 2003. Igualmente, veremos que podemos usar un compilador y un intérprete desde la línea de comando, si no tenemos Visual Studio. También puede instalarse sobre Mono.

Al terminar la instalación, nos queda un directorio c:\Program Files\FSharp-1.9.3.4:

Vean que hasta queda un .sh para instalar en Mono.

En el menú de programas aparece:

El intérprete fsi

Tenemos a nuestra disposición un programa interactivo, desde el menú que nos queda, o disponible desde bin\fsi.exe:

C:\Program Files\FSharp-1.9.3.4\bin>fsi MSR F# Interactive, (c) Microsoft Corporation, All Rights Reserved F# Version 1.9.3.4, compiling for .NET Framework Version v2.0.50727 NOTE: NOTE: See 'fsi --help' for flags NOTE: NOTE: Commands: #r <string>;; reference (dynamically load) the given DLL. NOTE: #I <string>;; add the given search path for referenced DLLs. NOTE: #use <string>;; accept input from the given file. NOTE: #load <string> ...<string>;; NOTE: load the given file(s) as a compilation unit. NOTE: #time;; toggle timing on/off. NOTE: #types;; toggle display of types on/off. NOTE: #quit;; exit. NOTE: NOTE: Visit the F# website at http://research.microsoft.com/fsharp. NOTE: Bug reports to fsbugs@microsoft.com. Enjoy!

Usando let

Si ingresamos

> let x = 10;;

obtenemos:

val x : int

El ;; indica al programa que tiene que compilar y ejecutar lo ingresado. Notemos que de esta forma, x es un identificador, que contiene un valor de tipo entero. F# es un lenguaje tipado, y el tipo lo infiere a medida que vamos definiendo las expresiones.

Si ahora pedimos

> x;;

(el > no lo ingresamos, es parte del “prompt” que nos muestra el programa fsi) obtenemos

val it : int = 10

La conducta de fsi es imprimir al expresión y su tipo. Vean que aparece it: es la variable que usa cuando no especificamos que una expresión se asigna a un identificador (vamos a ver que variable no es variable en F#… 🙂

Definiendo funciones

Usando el mismo let, podemos definir funciones:

>  let dup x = x * 2;;
val dup : int -> int

La segunda línea indica que dup es un valor de tipo función que recibe un entero y devuelve un entero. Esto es fundamental en F#: las funciones son valores, como cualquier otro. El identificador dup ahora referencia a esa función.

Si lo aplicamos:

> dup 10;;
val it : int = 20

Para ver que una función es un valor como cualquier otro, veamos de pasar una función como parámetro:

> let apply f x = f (f x);;
val apply : (‘a -> ‘a) -> ‘a -> ‘a

El resultado es algo más críptico. El ‘a se refiere a un tipo aún no definido. Don Syme, el creador de F#, estuvo antes involucrado en la definición e implementación de Generics en .NET 2.0. Acá aparece algo de esa influencia.

Si pedimos

> apply dup 2;;

obtenemos

val it : int = 8

que es es lo mismo que haber pedido

> dup (dup 2);;

Conclusión

Para quien no esté familiarizado a la programación funcional, el concepto de función como valor de primera clase, ciudadano del lenguaje con los mismos derechos y deberes que los otros valores, es algo extraño. Para el que haya visto alguna de las primeras implementaciones de Lisp, y el cálculo lambda de Church, será una especie de deja vu.

Lo interesante de F# es que no sólo soporta este tipo de programación, sino, que abandonando la pretension de ser un lenguaje funcional puro, también soporta programación procedural, de objetos, y notablemente, el uso de todo el framework de .NET. Todo esto es lo que ha hecho que haya sido adoptado en varios ámbitos. Desde un proyecto de “research” de Microsoft, ha ido creciendo hasta hoy. Veremos qué lugar ocupa en el futuro, dentro de la panoplia de lenguajes que tenemos disponibles.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/