<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <!-- vim: ts=2:sts=2:sw=2:et:encoding=utf-8-->
<head>
<title>Clojure</title>
<meta name="copyright"
<p><a href="mailto:slack@codemaniacs.com">slack@codemaniacs.com</a></p>
</div>
+ <div class="slide">
+ <h1>¿Qué es Clojure?</h1>
+ <p> Cuatro grandes ideas: </p>
+ <ul>
+ <li>Dialecto de Lisp</li>
+ <li>Corre en la JVM (y en el CLR de .NET!)</li>
+ <li>Programación funcional</li>
+ <li>Concurrencia</li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Clojure es un dialecto de Lisp</h1>
+ <p> Algunos datos sobre Lisp: </p>
+ <ul>
+ <li>Diseñado en 1958
+ <ul><li>hace más de 50 años, sólo FORTRAN es más viejo</li></ul>
+ </li>
+ <li>Notación prefija
+ <ul><li>(* (+ 3 5) (* 2 2))</li></ul>
+ </li>
+ <li>Homoicónico: <b>el código son datos</b>
+ <ul><li>¡¡¡MACROS!!!</li></ul>
+ </li>
+ <li>Dinámico</li>
+ <li>Recolección de basura</li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Clojure corre en la JVM</h1>
+ <ul>
+ <li>Compila a <i>bytecode</i>
+ <ul><li>Eficiente... relativamente ;-)</li></ul>
+ </li>
+ <li>Los tipos básicos son los de Java
+ <ul><li>java.lang.String, java.lang.Integer...</li></ul>
+ </li>
+ <li>Puede acceder a toda la biblioteca de clases de Java
+ </li>
+ <li>Sintaxis específica para la interoperabilidad con Java
+ <ul>
+ <li> (.toUpperCase "hola") </li>
+ <li> Detalles más adelante ;-) </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Clojure es un lenguaje funcional</h1>
+ <p>Clojure tiene muchas de las características de los lenguajes funcionales:</p>
+ <ul>
+ <li>Funciones como "objetos de primer orden"
+ <ul><li>Funciones de orden superior: map, reduce...</li></ul>
+ </li>
+ <li>Estructuras de datos inmutables</li>
+ <li><i>Lazy sequences</i></li>
+ </ul>
+ <p>...pero no es un lenguaje funcional puro al estilo Haskell</p>
+ <ul>
+ <li>Variables (referencias)</li>
+ <li>Evaluación estricta en lugar de perezosa</li>
+ <li>Los objetos del mundo Java tienen estado mutable</li>
+ <li>I/O</li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Clojure está diseñado pensando en la concurrencia</h1>
+ <ul>
+ <li>El código funcional puro es concurrente <i>per se</i>
+ <ul><li>No hay estado mutable, por lo tanto no hay condiciones de carrera</li></ul>
+ </li>
+ <li>El acceso al estado mutable se puede controlar mediante transacciones o "agentes"</li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Primitivas</h1>
+ <ul>
+ <li>Números:
+ <ul>
+ <li>Enteros (pasan a bignums si desbordan): <code>1234</code></li>
+ <li>Ratios: <code>22/7</code></li>
+ <li>Doubles: <code>3.0</code></li>
+ </ul>
+ </li>
+ <li>Cadenas: <code>"Hola, mundo"</code></li>
+ <li>Keywords: <code>:cosa</code></li>
+ <li>Símbolos: <code>cosa</code></li>
+ <li>Booleanos: <code>true</code>,<code>false</code></li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Estructuras de datos</h1>
+ <ul>
+ <li>Listas: <code>(1 2 3 4)</code>
+ <ul>
+ <li>La clásica lista simplemente enlazada, inserción eficiente al principio</li>
+ </ul>
+ </li>
+ <li>Vectores: <code>[1 2 3 4]</code>
+ <ul>
+ <li>Acceso aleatorio:
+ <ul><li><code>(def v [1 2 3 4])<br />(v 0) => 1</code></li></ul>
+ </li>
+ <li>Inserción eficiente al final. ¡Ojo! No son arrays</li>
+ </ul>
+ </li>
+ <li>Diccionarios: <code>{:a 1, :b 2}</code>
+ <ul>
+ <li><code>({:a 1, :b 2} :b) => 2</code></li>
+ <li><code>({:a 1, :b 2} :x) => nil</code></li>
+ </ul>
+ </li>
+ <li>Conjuntos: <code>#{1 2 :a "blah"}</code> </li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Programas = Estructuras de datos</h1>
+ <ul>
+ <li>Una lista no vacía se considera una llamada a una función, a una forma especial o a una macro</li>
+ <li>Las formas especiales son excepciones a la norma de evaluación de funciones (primero argumentos, luego llamada)
+ <ul>
+ <li><code>(def name val)</code>: crea una variable global</li>
+ <li><code>(fn name? [params*] exprs*)</code>: crea una función</li>
+ <li><code>(if test then else?)</code>: evaluación condicional</li>
+ <li><code>(let [bindings*] exprs*)</code>: crea "variables" (aliases) locales </li>
+ <li><code>(quote form)</code>: devuelve form sin evaluar</li>
+ <li><code>(do exprs*)</code>: evalua expresiones en orden, devuelve la última</li>
+ <li>...y algunas más</li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+
+ <div class="slide">
+ <h1>Entonces... ¿qué pinta tiene un programa?</h1>
+ </div>
+
<div class="slide">
<h1>En busca del lenguaje de programación ideal</h1>
<ul class="incremental">
</ul>
</div>
- <div class="slide incremental">
- <h1 class="non-incremental">Patrones de diseño</h1>
- <p class="non-incremental">La comunidad de seguidores de la OOP adora los patrones de diseño</p>
- <ul>
+ <div class="slide">
+ <h1>Patrones de diseño</h1>
+ <p>La comunidad de seguidores de la OOP adora los patrones de diseño</p>
+ <ul class="incremental">
<li>Su uso se considera una señal de madurez</li>
+ <li>Otros los consideran una señal de alarma:
+ <div class="hbox" style="align:center; height:25%">
+ "When I see patterns in my programs, I consider it a sign of trouble. The
+ shape of a program should reflect only the problem it needs to solve. Any
+ other regularity in the code is a sign, to me at least, that I'm using
+ abstractions that aren't powerful enough - often that I'm generating by
+ hand the expansions of some macro that I need to write."
+ <br />
+ -- Paul Graham
+ </div>
+ </li>
</ul>
- <div class="hbox" style="align:center; height:21%">
- "When I see patterns in my programs, I consider it a sign of trouble. The
- shape of a program should reflect only the problem it needs to solve. Any
- other regularity in the code is a sign, to me at least, that I'm using
- abstractions that aren't powerful enough - often that I'm generating by
- hand the expansions of some macro that I need to write."
- </div>
</div>
<div class="slide">
<h1>Es mas... ¿por qué creemos que la OOP es la panacea?</h1>
<p>Alexander Stepanov (coautor de la STL) dijo una vez:</p>
- <ul>
+ <ul class="incremental">
<li>I find OOP <b>technically unsound</b>. It attempts to decompose the world in
terms of interfaces that vary on a single type. To deal with the real
problems you need multisorted algebras - families of interfaces that span