Introducción a la Programación en Clojure

  • ¿Por qué Clojure?
  • ¿En qué es bueno Clojure?
  • ¿Qué tal se ve Clojure?
  • Qué es el REPL?
  • El REPL en acción

¿Por qué Clojure?

Si nunca programaste antes, puede que no sepas que hay muchos lenguages de dónde elegir. Puede que hayas escuchado de otros lenguajes (o escucharás de ellos!) como C, JavaScript, Python y Java.

Entonces ¿por qué estamos enseñando Clojure? Aunque no es tan popular como algunos de esos lenguajes, estamos usando Clojure por tres cualidades que tiene que lo hacen ideal como primer lenguaje para aprender (o un gran lenguaje para aprender!) además de otros que tal vez ya conozcas:

Clojure es simple

Clojure es simple. Esto no quiere decir que no sea poderoso; lo es. El número de conceptos que tienes que saber para programar en Clojure es muy pequeño y fácil de entender. Clojure crece con vos mientras lo estas aprendiendo, y puedes ser muy productivo con un pequeño subconjunto del lenguaje.

Clojure es de propósito general

Clojure es de propósito general. Algunos lenguajes tienen un foco específico. JavaScript, por ejemplo, fue tradicionalmente usado solo en páginas web (aunque eso ha cambiado de alguna manera). Objective-C es usado principalmente para aplicaciones iPhone. Hoy vamos a hacer una aplicación para dibujar, pero puedes usar Clojure para cualquier tipo de aplicación facilmente.

Clojure es divertido

Clojure es divertido. Esto es una cuestión de opinión, por supuesto, pero pensamos que es verdad. Esperamos que durante este curso experimenten la alegría de construir un programa hecho en Clojure y hacer algo poderoso y sorprendente.

¿En qué es bueno Clojure?

Entonces, dijimos que Clojure es de propósito general, y lo es. Eso no significa que no tenga puntos fuertes.

Procesamiento de datos

Clojure es reconocido por ser bueno para el procesamiento de datos. Esto es porque tiene un buen set de estructuras de datos. Es decir, que tiene muchas maneras incorporadas de representar datos que lo hacen fácil y poderoso.

Concurrencia

Clojure es reconocido por su concurrencia. Pensá acerca de escribir instrucciones para cuatro de tus amigos sobre cómo construir una casa del árbol, pero en vez de escribirlas de manera que un sólo paso es realizado a la vez, cada uno de tus amigos hace parte del trabajo. Entonces, ellos coordinan el momento exacto para ensamblar esas partes en partes más grandes, y hacen esto una y otra vez hasta el final, cuando todas las partes se juntan. Estas instrucciones pueden ser realmente complicadas y difíciles de escribir (y probablemente difíciles de leer también). Clojure nos da algunas maneras fáciles de escribir este tipo de instrucciones para computadoras.

Todo!

Clojure también sirve para construir aplicaciones de dibujo con Quil, con el cual vamos a hacer algo juntos.

¿Qué tal se ve Clojure?

(print-str "Hello, World!")
(+ 3 4)
(forward :trinity 40)

Paréntesis

Viste los paréntesis?. Los paréntesis encierran instrucciones para la computadora en Clojure. Un paréntesis izquierdo es el comienzo de una instrucción, y su respectivo paréntesis derecho es el final de una instrucción. Normalmente, el código Clojure tiene un montón de paréntesis anidados, en otras palabras, los paréntesis anidados encierran instrucciones.

Funciones

Después de los paréntesis, veremos las instrucciones para la computadora. Esa instrucción es lo que normalmente llamamos una función. Las funciones hacen todo el trabajo duro en Clojure. print-str, + y forward son funciones. Cuando estas funciones se ejecutan, ellas retornan algún tipo de valor. En Clojure las funciones siempre retornan un valor.

Argumentos

La mayoria de las funciones usan argumentos (es todo aquello dentro de los parentesis después de la función). print-str utiliza “Hello, World!” y retorna una cadena de caracteres. + utiliza 3 y 4, los suma, y devuelve 7. forward utiliza :trinity y 40, mueve la tortuga en 40 y retorna el resultado.

Comentarios

Cuando escribimos código, trataremos de que sea lo más claro posible. Esto es un gran avance porque nuestro código puede ser leido por otros (a veces más que por nosotros mismos!), o podemos volver a leer nuestro propio código más tarde, y puede ser que hayamos olvidado cada detalle del código. Una manera de clarificar nuestro código es haciendo anotaciones con comentarios. Los comentarios son notas que agregamos al código, para nuestro propio bien, y que la computadora ignora.

En Clojure, los comentarios pueden ser comenzados con un punto y coma. Todo lo que va después de un punto y coma hasta el final de la línea es un comentario que es ignorado por la computadora. Solo un punto y coma es necesario, pero a veces puedes ver dos punto y coma en una fila, dependiendo del estilo usado.

Referencia: Comment

;; ejemplo de funciones de un slide anterior
(print-str "Hola, Mundo!")   ; el bien-conocido "hola mundo"
(+ 3 4)                      ; ¿por qué no 3 + 4? lo veremos después

¿Qué es el REPL?

“REPL” significa “Leer-Evaluar-Imprimir-Loop” (del inglés “Read-Eval-Print-Loop”) lo cual no tieme mucho sentido sin el contexto. Muchos lenguajes de programación, incluyendo Clojure, tienen una manera de escribir código interactivamente, con el cual puedes tener una respuesta instantanea. En otras palabras, el código es leído, luego es evaluado, el resultado es impreso en pantalla, y comienza nuevamente: un loop.

Read, Eval, Print, Loop

El repl de Nightcode

El REPL en acción

Nightcode InstaREPL

Para interactuar con Clojure, podemos usar el InstaREPL de Nightcode. esta es una buena manera de jugar con Clojure interactivamente.

Usando el REPL

Nightcode tiene un seteo de proyecto conectado con el REPL en el panel de abajo. Cuando el botón “Run with REPL” es clickeado, el REPL empieza.

Alternativamente, podemos iniciar un REPL usando leiningen en una terminal (sin Nightcode). En una terminal, escribe lein repl, entonces el REPL iniciará. Si ejecutamos lein repl en el directorio del proyecto (carpeta), verás la configuración.

Evaluar un programa y una línea

Nightcode nos deja evaluar un archivo entero (programa) o una línea(s). En Nightcode, después que el REPL ha iniciado “Reload File” y “Reload Selection” funcionan.

EJERCICIO 1: Prueba el InstaREPL de Nightcode

  1. Inicia Nightcode
  2. Importa myproject
    (el cual creaste mientras testeabas el setup de leiningen)
  3. Abrí core.clj
    (myproject -> src -> myproject -> core.clj
  4. Hacé click en el botón InstaREPL
  5. Escribí las funciones Clojure escritas abajo y observa qué pasa
(print-str "Hola, Mundo!")
(print-str "Hola, Mundo!" " " "desde Clojure")
(+ 3 4)
(- 3 4)
(* 3 4)

Asegurate de tipear las líneas exactamente como las ves, teniendo cuidado de poner los paréntesis en el lugar correcto.

EJERCICIO 2: Evaluar un archivo y una línea - Parte 1

  • Abrí el archivo welcometoclojurebridge/src/clojurebridge_turtle/walk.clj
  • Evaluá todo el archivo presionando “Run with REPL” seguido de “Reload File”
  • Mirá qué pasa después
  • Tipeá (forward 40) al fondo del archivo walk.clj en el editor. Evaluá esta línea eligiendo la línea y presionando “Reload Selection”
  • Mirá qué pasa después

(Continúa en el EJERCICIO 3)

EJERCICIO 3: Evaluar el archivo y la línea - Parte 2

(Suponiendo que el EJECICIO 2 está terminado)

  • Tipeá (right 90) y “enter” en el REPL (al fondo) Run with REPL pane
  • Mirá qué pasa con la tortuga
  • Pegale una mirada a Tortugas App API y Cómo pasear Tortugas [sección 1 y 2], y prueba más comandos para pasear tu tortuga

EJERCICIO 4: Mirar los docs de Clojure

  • En el fondo del REPL, intentá mirar la documentación para las funciones usadas
  • Podés usar el comando (doc function-name) para esto
  • Probá (doc +) y (doc forward) en el REPL
  • Probá alguna otra función que hayamos usado, por ejemplo, -, *, o doc

Volvé al primer slide, o andá al outline del curriculum.