Added language description
authorslack <slack@codemaniacs.com>
Tue, 8 Dec 2009 02:24:03 +0000 (03:24 +0100)
committerslack <slack@codemaniacs.com>
Tue, 8 Dec 2009 02:24:03 +0000 (03:24 +0100)
clojure-slides.xhtml

index 464f81c78868b45d77faad675a249f12b64af817..fac7d4f079303f4e539cae1da3a01d62c58e28b0 100755 (executable)
@@ -2,6 +2,7 @@
 <!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) &nbsp;&nbsp;=&gt; 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) &nbsp;&nbsp;=&gt; 2</code></li>
+        <li><code>({:a 1, :b 2} :x) &nbsp;&nbsp;=&gt; 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