Una introducción a Clojure y por qué usar programación funcional.
Mi experiencia al conocer Clojure luego de haber sido desarrollador de aplicaciones con Java, Grails y Rails.
1. Introducción a CloIntroducción a Clojjureure
Una intro a Clojure y por qué usar programación funcionalUna intro a Clojure y por qué usar programación funcional
Denis Fuenzalida – Junio de 2013Denis Fuenzalida – Junio de 2013
denis.fuenzalida@gmail.comdenis.fuenzalida@gmail.com
2.
3. ““Martin Fowler hace la siguienteMartin Fowler hace la siguiente
observación:observación:
El verdadero legado de Java seráEl verdadero legado de Java será
la plataforma, no el lenguaje...la plataforma, no el lenguaje...
4. ...ahora mismo, hay más de 200...ahora mismo, hay más de 200
lenguajes que corren sobre la JVMlenguajes que corren sobre la JVM
yy es inevitable que uno de elloses inevitable que uno de ellos
llegue a superar a Javallegue a superar a Java como lacomo la
mejor forma de programar la JVM.”mejor forma de programar la JVM.”
–– Neal Ford en “Neal Ford en “Java.nextJava.next””
http://nealford.com/pub.htmlhttp://nealford.com/pub.html
7. ““Vale la pena aprender Lisp porVale la pena aprender Lisp por
lala profunda experiencia deprofunda experiencia de
iluminacióniluminación que obtendrásque obtendrás
cuando finalmente lo entiendas...cuando finalmente lo entiendas...
8. ...esa experiencia te hará un mejor...esa experiencia te hará un mejor
por programador el resto de tuspor programador el resto de tus
días, incluso si en realidad nuncadías, incluso si en realidad nunca
lo utilizas mucho.”lo utilizas mucho.”
–– Eric S. Raymond en “Eric S. Raymond en “Como convertirse en HackerComo convertirse en Hacker””
http://www.catb.org/esr/faqs/hacker-howto.htmlhttp://www.catb.org/esr/faqs/hacker-howto.html
12. •• Un Lisp, para programación funcionalUn Lisp, para programación funcional
•• Simbiótico con una plataforma probadaSimbiótico con una plataforma probada
•• Diseñado para programación concurrenteDiseñado para programación concurrente
…… pero no lo encontró,pero no lo encontró, así que lo hizo él mismoasí que lo hizo él mismo
http://clojure.org/http://clojure.org/rationalerationale
13. ;; Esta linea es un comentario;; Esta linea es un comentario
(+ 1 2 3)(+ 1 2 3)
;= 6;= 6
(+ (* 2 3 4) 100)(+ (* 2 3 4) 100)
;= 124;= 124
((defdef colorescolores #{#{:blanco :azul :rojo:blanco :azul :rojo})})
(colores(colores :rojo:rojo))
;= :rojo;= :rojo
(colores(colores :verde:verde))
;= nil;= nil
((defdef numerosnumeros {{:one:one "uno""uno",, :two:two "dos""dos" })})
(numeros(numeros :two:two))
;= "dos";= "dos"
16. public class Person {public class Person {
private String name;private String name;
private Integer age;private Integer age;
public Person() { }public Person() { }
public String getName() { return name; }public String getName() { return name; }
public Integer getAge() { return age; }public Integer getAge() { return age; }
public void setName(String name) {public void setName(String name) {
this.name = name;this.name = name;
}}
public void setAge(Integer age) {public void setAge(Integer age) {
this.age = age;this.age = age;
}}
}}
17. $ psql myrailsapp_dev$ psql myrailsapp_dev
myrailsapp_dev=# d projects;myrailsapp_dev=# d projects;
Table "public.projects"Table "public.projects"
Column | TypeColumn | Type
------------+-----------------------------------------+-----------------------------
id | integerid | integer
user_id | integeruser_id | integer
enabled | booleanenabled | boolean
created_at | timestamp without time zonecreated_at | timestamp without time zone
updated_at | timestamp without time zoneupdated_at | timestamp without time zone
23. •• Una secuencia de 1000 números repartidos en 100Una secuencia de 1000 números repartidos en 100
vectores de 10 números cada unovectores de 10 números cada uno
•• 1010 threadsthreads manipularán estos númerosmanipularán estos números
•• Cada thread selecciona 2 posiciones al azar entre dosCada thread selecciona 2 posiciones al azar entre dos
vectores elegidos al azar e intercambia los valoresvectores elegidos al azar e intercambia los valores
•• Correr 100.000 iteraciones y ver si ocurrenCorrer 100.000 iteraciones y ver si ocurren
inconsistencias (faltan números, deadlocks...)inconsistencias (faltan números, deadlocks...)
http://en.wikipedia.org/wiki/Clojure#Exampleshttp://en.wikipedia.org/wiki/Clojure#Examples
32. •• Python, Groovy y Ruby tienen elementosPython, Groovy y Ruby tienen elementos
funcionales, Java 8 incluirá lambdasfuncionales, Java 8 incluirá lambdas
→→ Clojure tiene eso y más disponible hoyClojure tiene eso y más disponible hoy
• Rápido como Java y soluciona problemas• Rápido como Java y soluciona problemas
complejoscomplejos
33. •• Cuando es práctico, se puede interoperar conCuando es práctico, se puede interoperar con
todo el ecosistema de Java y sus libreríastodo el ecosistema de Java y sus librerías
• Corre donde corra Java: apps de escritorio,• Corre donde corra Java: apps de escritorio,
Tomcat, AWS, Heroku, Google App Engine, etc.Tomcat, AWS, Heroku, Google App Engine, etc.
•• ClojureScriptClojureScript, Datomic* y Pedestal*, Datomic* y Pedestal*
44. CréditosCréditos
Fondo “Concrete Texture” por Ember Studio
http://www.flickr.com/photos/emberstudio/7597659330/
Foto de Paul Graham por Niall Kennedy
http://www.flickr.com/photos/niallkennedy/137275735/
Sasha Grey con el libro de SICP por Ayanami_Rei
http://canv.as/p/1i1pr/reply/89490
Rick Hichey en el SF Clojure Users Group por Howard Lewis Ship
http://www.flickr.com/photos/hlship/3603090614
Rich Hickey “State, you're doing it wrong” por Pedro Teixeira
http://static.intelie.com.br/qconsp2010/presentation.html