Clojure logo Clojure

Jorge 'slack' Gorbe

slack@codemaniacs.com

C++ mola, ¿por qué no te gusta?

"In computer programming, boilerplate is the term used to describe sections of code that have to be included in many places with little or no alteration. It is more often used when referring to languages which are considered verbose, i.e. the programmer must write a lot of code to do minimal jobs."

http://en.wikipedia.org/wiki/Boilerplate_%28text%29#Boilerplate_code

C++ mola, ¿por qué no te gusta?

C++ mola, ¿por qué no te gusta?

C++ mola, ¿por qué no te gusta?

Es mas... ¿por qué creemos que la OOP es la panacea?

Alexander Stepanov (coautor de la STL) dijo una vez:

¿Qué es Clojure?

Lenguaje de programación diseñado por Rich Hickey, basándose en cuatro grandes ideas:

Clojure es un dialecto de Lisp

Algunos datos sobre Lisp:

Clojure corre en la JVM

Clojure es un lenguaje funcional

Clojure tiene muchas de las características de los lenguajes funcionales:

...pero no es un lenguaje funcional puro al estilo Haskell

Clojure está diseñado pensando en la concurrencia

Primitivas

Estructuras de datos

Programas = Estructuras de datos

Entonces... ¿qué pinta tiene un programa?

(ns wordcount (:gen-class)
  (:use clojure.contrib.str-utils))

(defn num-lines [text] (count (re-split #"\n" text)))
(defn num-words [text] (count (re-split #"\s+" text)))
(defn num-characters [text] (count text))

(defn -main [file]
  (let [text (slurp file)]
    (println (num-lines text) (num-words text) (num-characters text))))

Macros: extendiendo Clojure

(defn f [x]
  (let [resto (mod x 3)]
    (cond
      (= resto 0) "cero"
      (= resto 1) "uno"
      (= resto 2) "dos")))

Macros: extendiendo Clojure

(defmacro cond
  "Takes a set of test/expr pairs. It evaluates each test one at a
    time. If a test returns logical true, cond evaluates and returns
    the value of the corresponding expr and doesn't evaluate any of
    the other tests or exprs. (cond) returns nil."
  [& clauses] ;argumentos variables, clauses es una lista
  (when clauses
    (list 'if (first clauses)
         (if (next clauses)
           (second clauses)
           (throw (IllegalArgumentException.
                   "cond requires an even number of forms")))
         (cons 'cond (next (next clauses)))))) ;definición recursiva

Lazy sequences

Multimétodos

Multimétodos (II)

Java interop

Java interop (II)

Problemas

Conclusiones

Referencias

Fin