From: slack
Date: Tue, 8 Dec 2009 02:24:03 +0000 (+0100)
Subject: Added language description
X-Git-Url: http://slack.codemaniacs.com/git/?a=commitdiff_plain;h=fa5b2bb0df7d0177b588d81cc38902c297ffe835;p=clojure-slides.git
Added language description
---
diff --git a/clojure-slides.xhtml b/clojure-slides.xhtml
index 464f81c..fac7d4f 100755
--- a/clojure-slides.xhtml
+++ b/clojure-slides.xhtml
@@ -2,6 +2,7 @@
+
Clojure
slack@codemaniacs.com
+
+
¿Qué es Clojure?
+
Cuatro grandes ideas:
+
+ - Dialecto de Lisp
+ - Corre en la JVM (y en el CLR de .NET!)
+ - Programación funcional
+ - Concurrencia
+
+
+
+
+
Clojure es un dialecto de Lisp
+
Algunos datos sobre Lisp:
+
+ - Diseñado en 1958
+
- hace más de 50 años, sólo FORTRAN es más viejo
+
+ - Notación prefija
+
+
+ - Homoicónico: el código son datos
+
+
+ - Dinámico
+ - Recolección de basura
+
+
+
+
+
Clojure corre en la JVM
+
+ - Compila a bytecode
+
- Eficiente... relativamente ;-)
+
+ - Los tipos básicos son los de Java
+
- java.lang.String, java.lang.Integer...
+
+ - Puede acceder a toda la biblioteca de clases de Java
+
+ - Sintaxis especÃfica para la interoperabilidad con Java
+
+ - (.toUpperCase "hola")
+ - Detalles más adelante ;-)
+
+
+
+
+
+
+
Clojure es un lenguaje funcional
+
Clojure tiene muchas de las caracterÃsticas de los lenguajes funcionales:
+
+ - Funciones como "objetos de primer orden"
+
- Funciones de orden superior: map, reduce...
+
+ - Estructuras de datos inmutables
+ - Lazy sequences
+
+
...pero no es un lenguaje funcional puro al estilo Haskell
+
+ - Variables (referencias)
+ - Evaluación estricta en lugar de perezosa
+ - Los objetos del mundo Java tienen estado mutable
+ - I/O
+
+
+
+
+
Clojure está diseñado pensando en la concurrencia
+
+ - El código funcional puro es concurrente per se
+
- No hay estado mutable, por lo tanto no hay condiciones de carrera
+
+ - El acceso al estado mutable se puede controlar mediante transacciones o "agentes"
+
+
+
+
+
Primitivas
+
+ - Números:
+
+ - Enteros (pasan a bignums si desbordan):
1234
+ - Ratios:
22/7
+ - Doubles:
3.0
+
+
+ - Cadenas:
"Hola, mundo"
+ - Keywords:
:cosa
+ - SÃmbolos:
cosa
+ - Booleanos:
true
,false
+
+
+
+
+
Estructuras de datos
+
+ - Listas:
(1 2 3 4)
+
+ - La clásica lista simplemente enlazada, inserción eficiente al principio
+
+
+ - Vectores:
[1 2 3 4]
+
+ - Acceso aleatorio:
+
(def v [1 2 3 4])
(v 0) => 1
+
+ - Inserción eficiente al final. ¡Ojo! No son arrays
+
+
+ - Diccionarios:
{:a 1, :b 2}
+
+ ({:a 1, :b 2} :b) => 2
+ ({:a 1, :b 2} :x) => nil
+
+
+ - Conjuntos:
#{1 2 :a "blah"}
+
+
+
+
+
Programas = Estructuras de datos
+
+ - Una lista no vacÃa se considera una llamada a una función, a una forma especial o a una macro
+ - Las formas especiales son excepciones a la norma de evaluación de funciones (primero argumentos, luego llamada)
+
+ (def name val)
: crea una variable global
+ (fn name? [params*] exprs*)
: crea una función
+ (if test then else?)
: evaluación condicional
+ (let [bindings*] exprs*)
: crea "variables" (aliases) locales
+ (quote form)
: devuelve form sin evaluar
+ (do exprs*)
: evalua expresiones en orden, devuelve la última
+ - ...y algunas más
+
+
+
+
+
+
+
Entonces... ¿qué pinta tiene un programa?
+
+
En busca del lenguaje de programación ideal
-
-
Patrones de diseño
-
La comunidad de seguidores de la OOP adora los patrones de diseño
-
+
+
Patrones de diseño
+
La comunidad de seguidores de la OOP adora los patrones de diseño
+
- Su uso se considera una señal de madurez
+ - Otros los consideran una señal de alarma:
+
+ "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."
+
+ -- Paul Graham
+
+
-
- "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."
-
Es mas... ¿por qué creemos que la OOP es la panacea?
Alexander Stepanov (coautor de la STL) dijo una vez:
-
+
- I find OOP technically unsound. 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