Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducción a la programación funcional con Cl...

Introducción a la programación funcional con Clojure, StarTechConf 2013

Clojure es un lenguaje funcional moderno, multipropósito, que hace énfasis en la inmutabilidad, concurrencia y simbiosis con el ecosistema de Java. Esta charla es una introducción a su filosofía, cómo entenderlo (si vienes de otros lenguages como JavaScript o Ruby) y como usarlo.

Denis Fuenzalida

October 26, 2013
Tweet

More Decks by Denis Fuenzalida

Other Decks in Technology

Transcript

  1. Introducción a la Introducción a la programación programación funcional con

    Clo funcional con Cloj jure ure Denis Fuenzalida - @dfuenzal Denis Fuenzalida - @dfuenzal StarTechConf 2013 StarTechConf 2013
  2. $ whoami $ whoami • 2000: Desarrollador web – Java

    – Frameworks de turno: Servlets, EJB2, Spring... • 2009: Groovy + Grails • 2011: Ruby + Rails • 2012: Clojure, en prod desde 2013
  3. Paul Graham Paul Graham “ “Si te fijas en estos

    Si te fijas en estos lenguajes: lenguajes: Java Java, , Perl Perl y y Python Python, notarás , notarás un patrón... un patrón... ...cada uno de ellos ...cada uno de ellos se asemeja se asemeja cada cada vez más a Lisp vez más a Lisp...” ...” “ “The Revenge of the Nerds” The Revenge of the Nerds”
  4. Clojure Clojure Un lenguaje de la familia de Un lenguaje

    de la familia de LISP LISP: : funcional funcional, , multipropósito multipropósito que corre sobre la máquina que corre sobre la máquina virtual de virtual de Java Java
  5. Rich Hickey • • Un Lisp, para programación funcional Un

    Lisp, para programación funcional • • Simbiótico con una plataforma probada Simbiótico con una plataforma probada • • Diseñado para programación concurrente Diseñado para programación concurrente
  6. “ “Funcional” Funcional” jQuery $("#foo").bind( "click", function() { alert( $(

    this ).text() ); }); NodeJS http.createServer(function (req, resp) { resp.writeHead(200, {'Content-Type': 'text/plain'}); resp.end('Hello World\n'); }).listen(8124);
  7. (def lista-numeros '(1 2 3 4 5)) (def lista-homogenea '(“hola!”,

    :OK, lista-numeros)) (def vector-primos-hasta-20 [2, 3, 5, 7, 11, 13, 17]) (def set-colores-bandera #{:blanco :azul :rojo}) (def map-ingles {:one “uno”, :two “dos”, :three “tres”}) (def cuadrado (fn [x] (* x x))) Sintaxis básica Sintaxis básica
  8. “ “Funcional” Funcional” Funciones: elementos de primer nivel del lenguaje

    (defn reverse-string “Retorna un string con su argumento en reversa” [x] (apply str (reverse (str x)))) (reverse-string “1234”) “4321” (map reverse-string (range 10, 15)) ("01", "11", "21", "31", "41")
  9. “ “Code = Data” Code = Data” Los programas en

    Clojure son estructuras de datos (defn reverse-string “Retorna un string...” [x] (apply str (reverse (str x)))) ← Lista ← Nombre (“symbol”) ← String ← Vector de 1 elemto ← Lista(s) anidada(s)
  10. “ “LISP” LISP” El ingrediente secreto: Macros (if (or true

    false) :uno :otro) :uno (source or) (defmacro or ([] nil) ([x] x) ([x & next] `(let [or# ~x] (if or# or# (or ~@next)))))
  11. LISP: Macros LISP: Macros (defmacro with-server [options & body] `(let

    [server# (run-jetty app ~(assoc options :join? false))] (try (connect-mongo (:db options)) ~@body (finally (.stop server#))))) (with-server {:port 34567 :db “testing” } ;; código en el contexto de que existe un servidor y BD ) “try with resources” de Java 7, disponible al instante
  12. Macros: lenguaje Macros: lenguaje moldeable moldeable Quieres usar otros paradigmas

    para desarrollar? Están disponibles a la carta, como bibliotecas: • Diseño por Contratos (Eiffel): core.contracts • Programación lógica (Prolog): core.logic • Hebras livianas y Channels (Go): core.async • Tipos de datos, validación al compilar: core.typed • Modelo de actores (Erlang): pulsar
  13. REPL REPL • Desarrollo interactivo • Todo el lenguaje disponible,

    todo el tiempo • Conexión remota, independiente del cliente • Modificar programas en ejecución denis@laptop:~/Proyectos/demoweb$ lein repl REPL server started on port 51444 demoweb.core=> (reduce + (range 100)) 4950 demoweb.core=> (runserver)
  14. Ron Garret Ron Garret Sonda Sonda Deep Space 1 (DS1)

    Deep Space 1 (DS1), 1999 , 1999 Jet Propulsion Laboratory, NASA Jet Propulsion Laboratory, NASA
  15. “… “… depurar un programa depurar un programa en hardware

    en hardware que vale 100 milllones de dólares y que que vale 100 milllones de dólares y que está a 100 millones de kms. es una está a 100 millones de kms. es una interesante experiencia... interesante experiencia...
  16. … … el tener un el tener un REPL REPL

    en la nave espacial en la nave espacial fue invaluable a la hora de encontrar y fue invaluable a la hora de encontrar y corregir el problema” corregir el problema”
  17. Clojure Clojure Un lenguaje de la familia de Un lenguaje

    de la familia de LISP: funcional, multipropósito LISP: funcional, multipropósito que que corre sobre la máquina corre sobre la máquina virtual de Java virtual de Java
  18. Integrado con Java Integrado con Java Acceso a todo el

    JDK y bibliotecas de Java (get (System/getProperties) "java.runtime.version") "1.7.0_21-b11" (javadoc java.util.Calendar) Abre "http://java.sun.com/javase/7/docs/api/java/util/Calendar.html" (.. (java.util.Calendar/getInstance) getTimeZone getID) "America/Santiago"
  19. // Clase StringUtils de Apache Commons Lang v2.6 (2011) public

    class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)){ return false; } } return true; } } ;; Implementación en Clojure (defn blank? [str] (every? #(Character/isWhitespace %) str))
  20. Neal Ford Neal Ford “ “El verdadero legado de El

    verdadero legado de Java será Java será la plataforma, la plataforma, no el lenguaje no el lenguaje, ahora , ahora mismo hay más de 200 mismo hay más de 200 lenguajes que corren lenguajes que corren sobre la JVM... sobre la JVM...
  21. ... y ... y es inevitable que es inevitable que

    uno de ellos llegue a uno de ellos llegue a superar a Java superar a Java como la como la mejor forma de mejor forma de programar la JVM.” programar la JVM.” Neal Ford en “Java.next”, IBM DW Neal Ford en “Java.next”, IBM DW
  22. Conclusión Conclusión • Acércate a la programación funcional • Incluso

    Java 8 tiene elementos funcionales • Más y mejor, con Clojure, hoy • Clojure es rápido como Java • Mejor en problemas complejos: concurrencia
  23. Conclusión Conclusión • Interoperabilidad con ecosistema Java y bibliotecas •

    Ecosistema emergente de bibliotecas funcionales • Clojure en Heroku, App Engine, AWS, Tomcat... • lein-droid (Android)* y lein-fruit (iOS)* • ClojureScript: “fat client apps” • Buen soporte en editores: emacs, vim, sublime text • Buen soporte en IDEs: eclipse, intellij idea
  24. Quienes usan Clojure Quienes usan Clojure Twitter, Netflix, Citibank, Amazon,

    Akamai, Disqus, Nokia Entertainment, WorldSingles, Groupon, Deutsche Bank, Factual, CircleCI, PowerInbox, Medularis Max Planck Institute for Molecular Biomedicine: “We employ Clojure to analyze and visualize gigabytes of genomic data.” Factual: “we need 3X the code when working in Java” ... “Please don’t make me write any more Java”