Clojure .. primer vistazo

¿Cómo entro al REPL de clojure?

java -jar clojure-1.3.0-RC0.jar

Debe salir esto:
 

¿Cómo salgo del REPL?

En Windows: Ctrl + C
En Linux: Ctrl + D

Hace tiempo que quería probar este lenguaje, y aprovechando las vacaciones por fin pude. Si Scala y Ceylon se me hacían algo "extraños", este en verdad si que lo es.

Hacer una sumatoria es bastante fácil (al menos así parece):

 

En Java:

Sumatoria.java

 

javac -g Sumatoria.java
java Sumatoria 3 4 5 6
sumatoria: 18

Otros lenguajes

Python

 

Scala

 

Groovy

 

Ceylon

 

Java

 

Clojure

 

Crear una lista es más fácil que en Java
Lista.java
 
Y ahora en clojure
 

Ligas

  1. http://www.moxleystratton.com/article/clojure/for-non-lisp-programmers
  2. http://clojure.org/downloads
  3. http://in.relation.to/Tutorials/IntroductionToCeylon
  4. http://try-ceylon.rhcloud.com/
  5. http://clojure-examples.appspot.com/
  6. http://tryclj.com/

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

REPL

si vas a comparar el REPL de clojure, debes compararlo entonces con el REPL de los otros lenguajes. En groovysh escribes "X" y sale "X" porque es el valor de retorno de lo que escribiste. Lo mismo en Scala (te sale el tipo y el resultado,  ). Si vas a try.ceylon-lang.org ahí sí debes poner  . En Clojure no imprimiste nada, simplemente evaluaste una cadena y como resultado obtuviste esa cadena.

Clojure es Lisp para la JVM. Lisp usa notación prefija, donde primero indicas el operador y luego los operandos (o la función y luego los argumentos). Lo de   con notación infija es simplemente  .

Imagen de ezamudio

ejercicios

Ahora intenta resolver algunos ejercicios relativamente simples como fizzbuzz, fibonacci, etc con Clojure, para que vayas entendiendo sus estructuras; eso ayuda mucho para aprender las diferencias entre lenguajes (y con Clojure vas a tener que aprender muchas diferencias, no solamente por la notación sino porque su filosofía en general es muy distinta).

Imagen de Sr. Negativo

Re: ejercicios

Si voy a tratar de hacer ejercicios.

Ahora si comparo el RELP : clojure vs groovy vs scala
 

 

 

Parecido a Scheme

La sumatoria en Scheme es bastante muy parecida
(¿será a caso porqué tanto Scheme cómo Clojure son
dialectos de Lisp?).
Por ejemplo para crear una función de cuadrados, en
Scheme sería algo como:
 

La sumatoria se hace de la misma manera a la que
indicas:
 

Declaración de variables
 

Sigamos la propuesta de @ezamudio y hagamos el
fizzbuzz en Scheme:
 

Gracias Sr. Negativo

Una pequeña correcion.

 

Usar + es valido como sumatoria pero es un macro,por lo que es mas lento.

(reduce + '(2 3 1 3))

@wishmaster77:
Clojure si es un lisp,con estructuras de datos inmutables, un STM para el manejo de concurrencia y algunas cosas de otros lenguajes funcionales,con mas cosas y mas funcional que Scheme.

 

Hay bastantes ejercicios en la pagina:

 

Sobre herramientas tenemos para paginas web que usa otras tecnologias,https://github.com/technomancy/leiningen lein para crear proyectos y resolver dependencias, parecido a ruby gem,para bases de datos ,y tambien esta Clojurescript Clojure que compila a Javascript para el navegador,pero parece que quieren extender la idea a Python,Scheme y hasta lenguajes de bajo nivel con LLVM.

Re: Gracias Sr. Negativo

Orale, se ve chido eso del Clojure, pero de momento no me gusta mucho que
hace unas mezclas un tanto raras, puesto que te paras sobre la JVM y no ahora
sí que no entiendo como mezclar la OOP con la FP, en clojure de verdad se
me hace muy difícil de comprender.

Sé que una cosa es ser inmutable y otra la inmutabilidad de las propiedades
de un objeto, pero, verlo desde Clojure para mí es complejo y medio. Creo que
Clojure entrará en mi lista de lenguajes a dominar después de que domine y
comprenda muy bien los principios funcionales por separado.

Respecto a Clojure y lo que puedo ver es un "de Java a Lisp", pero, de nuevo
no sé de momento creo tener unos conocimientos muy limitados del paradigma
funcional como para hacerme bolas con los objetos.

Respecto a lo de compilar un lenguaje a Javascript esa idea se veía ya con GWT
y otras tecnologías, lo que me sorprende es que quieran extender la idea a Scheme
si creo haber leído que el creador de JavaScript dijo que JavaScript era Scheme
con un l&f de Java.

Interesante información. En un rato más me aviento mi versión Scheme a ver que
tanto cambia de la Clojuresca.

Fibonacci Schemista

Bueno, ya me aventé el Fibonacci en versión Scheme...queda bastante parecido, pero con sus variaciones:
 

Clojure no es un lenguaje orientado a objetos

Esa es una de las cosas que mas me gusta de Clojure es muy simple y en realidad no se enfoca ni en FP, POO o lisp,si no en crear un lenguaje simple para el desarrollo de aplicaciones..

Clojure usando un conjunto de estructuras de datos basicas y simbolos crea un lenguaje uniforme, listas para los datos y contener funciones (),vectores como tuplas y para almacenar datos que necesites tener rapido acceso a cualquiera [] ,mapas como forma de representar los modelos y algunas partes del lenguaje {},simbolos para tener rapido acceso en hash y como parte del lenguaje :simbolo ,por eso vemos [], {} o : en algunas de las estructuras del lenguaje,el sistema de macros permite esta flexibilidad en realidad los framework de Clojure son bibliotecas que añaden macros y funciones como si fuera un DSL.

La parte de objectos tenemos:

 

La modularidad va con los namespace y los estados con el sistema de concurrencias.

Dos Platicas del creador de Clojure.

Y la presentacion de la segunda.

No es un lenguaje complejo cuando pierdes el miedo a los parentesis.

Imagen de Sr. Negativo

Reglas básicas

Clojure si que es un lenguaje bastante diferente a Java

Gracias @ezamudio y @BT

Reglas básicas para entender Clojure

  • Indicar primero el operador (+,-,*,/,mod) y luegos los operadores
  • Indicar la función y luego los argumentos
  • NO es un lenguaje orientado a objetos
  • Es un dialecto de Lisp
  • (haber que descubro más)

 

 

 

según recuerdo se pueden usar clases, pero no objetos?

Ahora me la complicaron más... Tenía entendido que clojure te permite usar las clases de la jvm, incluso @Sr. Negativo puso un ejemplo creando un "objeto" tipo Date. Ahí es donde no concibo como funciona. Si me pueden explicar.

En Clojure

Tambien puedes usar objetos e inicializarlos

 

Lo que no puedes hacer creo que es tomar una clase y hacer una subclase o ponerle una interfaz,el ejemplo que puse es en Clojure puedes usar mapas para representar los objetos y por protocolos hacer algo parecido a las interfaces en Java.

En general el lenguaje quiere que programes con las herramientas que tiene,mas te da la posibilidad de usar las clases de Java aunque de preferencia usalas lo minimo necesario.

Se me olvidaba tambien hay Clojure para .net y se empieza a trabajar para que ClojureScript tambien funcione con Node.js.

@Sr. Negativo:
En clojure los mapas se prefiere que las claves sean simbolos.
 

Imagen de alcides

Re: Parecido a Scheme

Una solución alternativa del FizzBuzz un poco mas idiomática usando Scheme Kawa y la biblioteca estándar de Scheme y Java podría ser:
 
Saludos cordiales.