Translate

sábado, 22 de enero de 2011

Facelets framework.


¿Que es Facelets?
Cuando JSF fue ideado, la intención fue reutilizar JSP como principal tecnología para la creación de paginas web, dado que es un estándar en la comunidad web.
La idea fue hacer natural la adopción de JSF por medio de etiquetas naturales que ya tienen una adopción el el mundo java.

Desafortunadamente JSP y JSF no se complementan entre si. JSP se usa para crear paginas web dinámicas pero no para crear arboles de componentes. En JSP los elementos son procesados desde el principio de la pagina hasta el final. JSF, sin embargo, tiene un ciclo de vida mucho más complejo, generación de componentes, y una generación separada en faces claras.

Si se mezcla JSP con JSF, el JSF se renderizara a medida que se vaya encontrando, en cambio los componentes JSF tiene cada uno su propio renderizado. Esto puede traer ciertos problemas.

Facelets llena el gap entre JSP y JSF. Esta centrado en la creación de arboles de componentes y el entrelazamiento de contenido con el complejo ciclo de vida de JSF. Facelets remplaza a JSP con una muy simple API que es el reflejo de principios simples y esto incorpora numerosas características que facilitan el desarrollo.

¿Porque utilizar Facelets?
Hay muchas razones por las que usar Facelts antes que JSP para el desarrollo de JSF:
  • No depende del contenedor, Facelts puede trabajar con cualquier implementación y versión de JSF.
  • La interacción entre JSP y JSF puede traer problemas.
  • Facelets provee templates, que pueden ser reutilizados
  • Su simpleza maximiza la reutilización, es extensible y escalable.
  • Facets soporta EL (Unified Expression Language)
  • Facets no requiere ninguna librería especial para el renderizado.

Descargar Facelets.
Facelets se puede descargar de la siguiente URL: http://facelets.dev.java.net/
El jar que se necesita para trabajar con Facelets es jsf- facelets.jar y las dependencias puede ser buscadas en el directorio lib.

Si usan maven la dependencia es:


com.sun.facelets
jsf-facelets
1.1.6



Configuración
Para configurar un proyecto web para que use Facelets en necesario configurar el Web Descriptor (web.xml) agregando lo siguiente:



..............


javax.faces.DEFAULT_SUFFIX
.xhtml




De esta forma indicamos que nuestras paginas van a finalizar con el subfijo xhtml.
Además como cualquier proyecto JSF hay que agregar el servlet y el servlet-mapping



Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
/faces/*



Además es necesario crear un archivo Configuración de Faces Descriptor (faces-config.xml) como cualquier proyecto JSF, donde es necesario remplazar el ViewHandler traido por defecto por:
com.sun.facelets.FaceletViewHandler de la siguiente manera:





com.sun.facelets.FaceletViewHandler





En faces-config.xml también se define las reglas de navegación.




home
/index.xhtml




parrot
/parrot.xhtml




eagle
/eagle.xhtml




Como se puede ver se define cada uno de los links a que htmlx debe ir.


Tags
Es necesario que las paginas Facelets sean un XML valido, cuando se utiliza una librería es necesario que se declare como un namespace, donde podemos mapear la URI a un prefijo como se puede apreciar en el siguiente ejemplo:












En el ejemplo usamos 3 librerías, una XML sin prefijo, otra para Facetlet tag con el prefijo ui y otra básica de JSF con el prefijo h.
En la siguiente tabla se puede ver los namespace más comunes:


NAMESPACEPREFIX LIBRARY XHTML
http://www.w3.org/1999/xhtml -- Facelets Templating
http://java.sun.com/jsf/facelets ui JSF Core
http://java.sun.com/jsf/core f JSF HTML
http://java.sun.com/jsf/html h MyFaces Tomahawk
http://myfaces.apache.org/tomahawk t MyFaces Tomahawk
http://myfaces.apache.org/sandbox s Sandbox
http://myfaces.apache.org/trinidad tr MyFaces Trinidad
http://java.sun.com/jstl/core c JSTL Core
http://java.sun.com/jsp/jstl/fmt fn JSTL Functions


Si se agrega un componente pero no se agrega el espacio de nombre correspondiente para el componente, habrá un error en el momento de compilación de la pagina.

Carga de las librerías de Tags
Facelets usa la siguiente estrategia para cargar las librerías de etiquetas. Primero, busca las librerías en la carpeta /META-INF dentro de los jars. Intenta cargar los archivos que tienen la siguiente forma *.taglib.xml. De esta forma se cargan librería de etiquetas estándares.
Luego, facelets chequea las librerías definidas en web.xml, inicializado como parámetros facelets.LIBRARIES. Esta estrategia es ideal para cuando se desea cargar una librería de etiquetas propia.

Varias librerías de etiquetas ya son incluidas en el jar de facelets:
  • Templating library: Contiene las etiquetas para la creación de plantillas.
  • JSF libraries: Dos librerías de etiquetas las cuales son incluidas por la especificación de JSF, son librerías incluidas por defecto por Facelets.
  • JSTL: Facelets provee soporte parcial a etiquetas de JavaServer Pages Standard Tag
  • Library (JSTL). Mientras la librería Function es totalmente soportada, La Core es parcialmente soportada, las etiquetas soportadas son: c:if, c:forEach, c:catch y c:set.

Otras Librerías
Para incluir otra librería de etiquetas se debe agregar la misma en la carpeta /META-INF y además se debe incluir el import del Taglib dentro de la aplicación.

Creación de plantillas
En las plantillas nosotros definimos básicamente el layout de la pagina, y los estilos. Con la etiqueta ui:insert podemos definir las áreas en la pagina que pueden ser sobreescritas, por las paginas que usan la plantilla (clientes). Para usar esta etiqueta es necesario el espacio de nombre: http://java.sun.com/jsf/facelets
El cliente usa este template con los tags ui:component, ui:composition, ui:fragment, o ui:decorate. Veamos un ejemplo de plantilla:





The Happy Birds Directory




The Happy Birds Directory






Welcome to the nest!






La pagina que utilice esta plantilla sera algo así:







Hola Mundo!!





Es usada la etiquete ui:composition para referenciar la plantilla utilizada. La etiqueta ui:define es utilizada para indicar a Facelts cual area se va a redefinir.
Las plantillas no están limitadas a un nivel, es posible tener varios niveles de plantillas, de este modo un cliente para un template puede ser un template para otro cliente.

jueves, 20 de enero de 2011

lunes, 17 de enero de 2011

WOA (Web-oriented architecture)

Web-oriented architecture (WOA), como SOA, tiene varias definiciones. Algunos ven a WOA como un estilo arquitectonico y un subestilo de SOA basado en aplicaciones web, más liviano que SOA. Otra definición es el uso de REST para construir servicios web usando tecnología web como HTTP y documentos XML.

Si buscamos una definición rapida podemos decir que :

SOA + Web 2.0 = WOA

El uso de REST y la separación de la interfaz (concebida de forma web pero que consulta los servicios por javascript expuestos mediante REST) dio nacimiento a este estilo arquitectónico.

Este enfoque mucho más orientado a la Web es algo que muchos han llamado Web-Oriented Architecture (WOA) y se basa en la enorme fuerza de tracción de la World Wide Web en sí y sus fundamentos arquitectónicos subyacentes. Y se basa en los conceptos básicos y los resultados que han hecho de la Web con mucho, la mayor red abierta en el planeta, así como el mayor SOA actualmente en existencia. En el extremo principal de esto es la historia de mashups de web con aplicaciones híbridas empresariales es una de las importantes mejoras en el entorno de TI que se anuncia la WOA.

domingo, 16 de enero de 2011

Más de Apache ActiveMQ


Siguiendo con la serie de post de Apache ActiveMQ en el post anterior hablamos de JMS. Ahora
empecemos con ActiveMQ. Como ya dijimos Apache ActiveMQ es un estupendo corredor de mensajes de código abierto y una maravillosa opción para mensajería asíncrona JMS. ActiveMQ comenzó siendo un proyecto de codehaus pero luego se traslado a Apache.

Antes de empezar es conveniente que se bajen el proyecto desde el siguiente link:
http://activemq.apache.org/download.html

Luego de bajar ActiveMQ, debe descomprimirlo. En el directorio base se van a encontrar un jar llamado activemq-all-version.jar donde versión es la versión del producto que descargo por ejemplo activemq-all-5.4.2 es para la versión 5.4.2. Éste jar es el que necesitara para añadir a la ruta de clase de la aplicación para poder utilizar la API de ActiveMQ

En el directorio bin, podrá encontrar un script llamado activemq el cual inicia ActiveMQ de la siguiente manera:

activemq console (en sistemas Unix-Like)
activemq (en Windows)

Si todo salio bien el servidor estará levantado en http://localhost:8161/.De esta forma ActiveMQ esta listo para recibir nuestros mensajes.

Veamos un poco la estructura de directorios de ActiveMQ, si vemos la carpeta base podremos identificar los siguientes archivos:
  • README.txt, NOTICE y LICENSE: Documentación, información de licencias y la licencia del producto.
  • WebConsole-README.txt: Contiene información del uso de la consola web.
  • activemq-all-5.3.0.jar: Jar que contiene todas las clases necesarias para utilizar Apache ActiveMQ
  • bin: directorio que contiene archivos binarios y ejecutables; además scripts para detener, iniciar y restablecer el servidor.
  • conf: directorio que contiene todos los archivos necesarios para configurar Apache ActiveMQ
  • data: es el directorio donde los archivos de log y archivos de datos son guardados.
  • docs: contiene un archivo index.html que hace referencia a la documentación.
  • example: contiene ejemplos.
  • lib: contiene las librerías que necesita Apache ActiveMQ para funcionar.
  • user-guide.html: documentación necesaria para empezar con ActiveMQ y además como correr un ejemplo.
  • webapps: directorio necesario para que funcione Apache ActiveMQ web Consola y otros demos web relacionados.
Esto fue una pequeña introducción a Apache ActiveMQ, más adelante veremos como utilizarlo.

sábado, 8 de enero de 2011

Apache ActiveMQ


Antes de empezar a leer este post miren este otro que sirve de introducción:

http://emanuelpeg.blogspot.com/2010/03/apache-activemq.html

Bueno, antes de empezar con ActiveMQ es necesario entender algunos conceptos de JMS.

Cuando necesitamos comunicar 2 aplicaciones por medio de una red, se hace prioritario que las dos aplicaciones estén disponibles, por ejemplo cuando una aplicación se comunica con otra por medio llamados a procedimientos remotos (COM, CORBA, DCE y EJB) la aplicación receptora del mensaje debe estar activa, si esto no es así no recibirá nunca el mensaje. En ocasiones es poco probable poder realizar una comunicación sincrónica. La mensajería asíncrona es una forma de enviar mensajes indirectamente de una aplicación a otra sin esperar una respuesta.

JMS ofrece a las aplicaciones Java la opción de comunicarse de forma asíncrona. Cuando los mensajes se envían de forma asíncrona, el cliente no tiene que esperar a que el servicio procese el mensaje, ni a que el mensaje sea entregado. El cliente envía si mensaje y después continua con la suposición de que el servicio finalmente lo recibirá y procesará.

Cuando nosotros enviamos una carta no la enviamos por nuestros propios medios sino que la enviamos por medio del servicio postal. Ponemos la dirección la estampilla y listo. De forma similar, la vía indirecta el la clave de JMS. Cuando una aplicación envía información a otra mediante JMS, no hay vinculo directo entre ambas aplicaciones. En su lugar, la aplicación emisora coloca el mensaje en manos de un servicio que garantiza su entrega a la aplicación receptora. Hay dos conceptos principales en JMS: corredores de mensaje (message brokers) y destinos.

Cuando una aplicación envía un mensaje, lo entrega a un corredor de mensajes. El corredor de mensajes es la respuesta JMS a la oficina de correos. EL corredor de mensajes se asegurará de que el mensaje sea entregado en el destino especificado, dejando que el emisor siga con sus asuntos.

Cuando enviamos un correo es importante poner la dirección para que el servicio postal sepa dónde debe ser entregada. De igual forma, en JMS, los mensajes tienen una dirección con un destino. Los destinos son como los buzones donde se colocan los mensajes hasta que alguien llega a recogerlos.

No obstante, a diferencia de las direcciones postales, que indican una persona especifica o una calle, los destinos son menos específicos. A los destinos solo les incumbe donde sera recogido el mensaje, no quien lo recogerá. De esta forma los destinos son como enviar una carta dirigida “al residente”.

En JMS, hay dos tipos de destinos: colas y temas. Cada uno de estos está asociado a un modelo de mensajería concreto, bien de punto a punto (para colas) o bien de emisor a suscriptor (para temas)

Punto a Punto: cada mensaje tiene exactamente un emisor y un receptor. Cuando se entrega el mensaje al corredor de mensajes, este lo pone en una cola, cuando el receptor pide el mensaje este es eliminado de la cola.

Emisor a suscriptor: El mensaje es enviado a un tema todos los suscriptores del tema recibiran una copia del mensaje.

  • La comunicación asíncrona a través de JMS ofrece diversas ventajas sobre la comunicación sincrónica:
  • La comunicación sincrónica implica una espera.
  • El cliente no esta acoplado a la disponibilidad del servicio
  • El cliente no esta acoplado a la ubicación del servicio

El post casi completo fue solo para JMS, en una segunda parte voy a profundizar ActiveMQ.

viernes, 31 de diciembre de 2010

Feliz 2011!!!


Un año transcurrió juntos, les deseo que se cumplan todos sus anhelos. En el 2011 espero que me sigan acompañando.


Feliz 2011 a todos!!!

jueves, 30 de diciembre de 2010

WSO2 Business Process Server




Estuve probando WSO2 Business Process Server (BPS) y quede gratamente sorprendido. No tengo experiencia en soluciones BPEL pero por lo pronto este producto me gusto.

WSO2 Business Process Server (BPS) es un Open Source Business Process Server fácil de usar que ejecuta procesos de negocios escritos siguiendo WS-BPEL estándar.

WS-BPEL esta emergiendo como un estándar por defecto para componer múltiples servicios asíncronos o síncronos, dentro de un flujo de procesos colaborativo y transaccional que incrementa la flexibilidad y agilidad de nuestra SOA (Service Oriented Architecture).

WSO2 BPS esta formado por Apache ODE e incluye una interfaz administrativa basada en la Web y funcionalidades de simulación. Además disponible con licencia Apache v2.

La versión actual de BPS es la 1.1.1

Dejo Link:

http://wso2.com/products/business-process-server/

lunes, 27 de diciembre de 2010

La propiedad intelectual tiene más valor cuando se comparte

Me gusto este post así que decidido compartirlo:

Más de Erlang

Continuando con el post: http://emanuelpeg.blogspot.com/2010/12/erlang.html vamos a seguir aprendiendo algo de erlang.

El case:

1> Animal = "dog".
2> case Animal of
2> "dog" -> underdog;
2> "cat" -> thundercat
2> end.
underdog

3> case Animal of
3> "elephant" -> dumbo;
3> _ -> something_else
3> end.
something_else

el _ es como el “default” de c, c++, java, etc...

El si es un tanto diferente a lo que conocemos, el si puede tener varias condiciones y varios resultados:

8> X = 0.
9> if
9> X > 0 -> positive;
9> X < 0 -> negative;
9> true -> zero
9> end.

Similar a javascript se puede asignar una función a una variable:

16> Negate = fun(I) -> -I end.
#Fun

17> Negate(1).
-1
18> Negate(-1).
1

Podemos usar funciones con listas

1> Numbers = [1, 2, 3, 4].
[1,2,3,4]
2> lists:foreach(fun(Number) -> io:format("~p~n", [Number]) end, Numbers).
1
2
3
4
ok

lists:foreach permite aplicar una función a cada elemento de una lista.
Si queremos filtrar los menores a 3 por ejemplo, es muy facil con lists:filter :

11> Small = fun(X) -> X < 0 end.

12> lists:filter(Small, Numbers).
[1,2]

EL lenguaje también provee una forma de saber si todos los elementos de una lista cumplen con un filtro:

15> lists:all(Small, [0, 1, 2]).
true
16> lists:all(Small, [0, 1, 2, 3]).
false


o si alguno lo cumple:

17> lists:any(Small, [0, 1, 2, 3]).
true
18> lists:any(Small, [3, 4, 5]).
false

Con foldl se puede hacer que una variable sea mantenida mientras la función esta iterando por la lista:

28> Numbers.
[1,2,3,4]
29> lists:foldl(fun(X, Sum) -> X + Sum end, 0, Numbers).
10

Como podemos ver la variable Sum se va pasando por cada ejecución de la función que acumula, y al comenzar la ejecución Sum = 0.
Hasta aquí hemos recorrido a vuelo de pájaro Erlang, un lenguaje original que nos muestra que se pueden hacer las cosas de diferente modo.

lunes, 20 de diciembre de 2010

Frase

Me gusto mucho esta frase y la quiero compartir:

La complejidad es uno de los principales problemas de la tecnología informática. Y que una y otra vez caemos en el error de que para resolver la complejidad lo que hace falta es todavía más complejidad.
-Donald Ferguson

Totalmente de acuerdo!!

domingo, 19 de diciembre de 2010

Erlang


Ya hemos hablado de erlangs en otros post, vamos a hacer un repaso y luego desarrollar ejemplos.

Erlang es un lenguaje de programación concurrente y un sistema de ejecución que incluye una máquina virtual y bibliotecas.

El subconjunto de programación secuencial de Erlang es un lenguaje funcional, con evaluación estricta, asignación única, y tipado dinámico. Fue diseñado en la compañía Ericsson para realizar aplicaciones distribuidas, tolerantes a fallos, soft-real-time y de funcionamiento ininterrumpido. Proporciona el cambio en caliente de código de forma que éste se puede cambiar sin parar el sistema. Originalmente, Erlang era un lenguaje propietario de Ericsson, pero fue cedido como software de código abierto en 1998. La implementación de Ericsson es, principalmente interpretada pero también incluye un compilador HiPE (sólo soportado en algunas plataformas).

La creación y gestión de procesos es trivial en Erlang, mientras que, en muchos lenguajes, los hilos se consideran un apartado complicado y propenso a errores. En Erlang toda concurrencia es explícita.

Bueno vamos a bajarnos el runtime de http://www.erlang.org/download.html esto para windows, si estan en linux es más fácil instalarlo por ejemplo en debian es así “apt-get install erlang”, y listo!

Se puede escribir codigo en un archivo .erl y luego compilarlo opteniendo el .beam (ejecutable) nosotros vamos a usar la consola.

Escribimos en la consola erl o werl(para windows)

erl
Erlang (BEAM) emulator version 5.4.13 [source]
Eshell V5.4.13 (abort with ^G)
1>

1> % Este es un comentario
2> 2 + 2.
4
3> 2 + 2,0.
4,0

Veamos las listas:
4> [1, 2, 3,4]
[1, 2, 3,4]

No se puede hacer operaciones con diferentes tipos por ejemplo la suma:

5> 4 + "string".
** exception error: bad argument in an arithmetic expression
in operator +/2
called as 4 + "string"

Las variables deben comenzar con mayuscula:

7> Var = 1.
1
8> Var = 2.
=ERROR REPORT==== 8-Jan-2010::11:47:46 ===
Error in process <0.39.0> with exit value: {{badmatch,2},[{erl_eval,expr,3}]}
** exited: {{badmatch,2},[{erl_eval,expr,3}]} **
8> Var.
1
Como se puede ver solo se puede asignar un valor a una variable una vez; esto es asi porque Erlang es un lenguaje funcional.

Un símbolo es una palabra en minuscula (en la mayoria de los lenguajes que lo implementa) que sirve para representar algo. En Erlang el símbolo se denomina atoms.

9> red.
red
10> Pill = blue.
blue
11> Pill.
blue


Las listas son un conjunto de elementos que pueden tener diferente tipo y longitud:

13> [1, 2, 3].
[1,2,3]
14> [1, 2, "three"].
[1,2,"three"]
15> List = [1, 2, 3].
[1,2,3]

Tuples es una lista fija y heterogénea:

18> {one, two, three}.
{one,two,three}
19> Origin = {0, 0}.
{0,0}

Estas estructuras pueden convinarse:

20> {name, "Spaceman Spiff"}.
{name,"Spaceman Spiff"}
21> {comic_strip, {name, "Calvin and Hobbes"}, {character, "Spaceman Spiff"}}.
{comic_strip,{name,"Calvin and Hobbes"},
{character,"Spaceman Spiff"}}

24> Person = {person, {name, "Agent Smith"}, {profession, "Killing programs"}}.
{person,{name,"Agent Smith"},
{profession,"Killing programs"}}

Para obtener valores de la persona podemos hacer lo siguiente:

25> {person, {name, Name}, {profession, Profession}} = Person.
{person,{name,"Agent Smith"},
{profession,"Killing programs"}}
26> Name.
"Agent Smith"
27> Profession.
"Killing programs"

Se entiende? Obtenemos los valores en Name y Profession por medio de patrones de coincidencia.
Y con patrones de coincidencia se puede hacer más cosas:

28> [Head | Tail] = [1, 2, 3].
[1,2,3]
29> Head.
1
30> Tail.
[2,3]
32> [One, Two|Rest] = [1, 2, 3].
[1,2,3]
33> One.
1
34> Two.
2
35> Rest.
[3]

Si no hay suficientes elementos en la lista el patrón no funciona:

6> [X|Rest] = [].
** exception error: no match of right hand side value []

Erlang es dinámicamente tipado, Erlang puede enlazar tipos en runtime. Vamos a hacer una función para esto vamos a hacer un modulo. Yo uso debian pero para windows debe ser parecido.
Salimos del runtime Ctrl + G.
Escribimos:
nano basic.erl
En nano escribimos el siguiente código:

-module(basic).
-export([mirror/1]).
mirror(Anything) -> Anything.

Salimos y guardamos. Luego escribimos erl en la consola.
Y por ultimo compilamos:

1> c(basic).
{ok,basic}

La función mirror solo devuelve lo que pasamos como parámetro. Pueden ver que el operador -> simplifica el return.

5> mirror(smiling_mug).
** exception error: undefined shell command mirror/1
6> basic:mirror(smiling_mug).
smiling_mug
6> basic:mirror(1).
1
Vemos que hay que ingresar el nombre del modulo.

-module(matching_function).
-export([number/1]).
number(one) -> 1;
number(two) -> 2;
number(three) -> 3.

En la siguiente función se puede ver la influencia de Prolog en Erlang.
Por ultimo implementemos factorial y figonacci :

-module(yet_again).
-export([another_factorial/1]).
-export([another_fib/1]).
another_factorial(0) -> 1;
another_factorial(N) -> N * another_factorial(N-1).
another_fib(0) -> 1;
another_fib(1) -> 1;
another_fib(N) -> another_fib(N-1) + another_fib(N-2).

Hasta aca vimos muy por arriba Erlang en proximos post vamos a seguir hablando.

Dejo links:

jueves, 16 de diciembre de 2010

Google regala los productos de Instantiations a la Fundación Eclipse

Siempre quise programar en GWT ahora se me va a ser más fácil con los productos que google regalo a la comunidad de eclipse por ende a nosotros.

Google ha donado WindowBuilder Pro (que incluye Swing Designer, SWT Designer y GWT Designer) y CodePro Profiler a la comunidad de código abierto y que en la primera mitad de 2011 pasarán a ser nuevos proyectos de Eclipse.

Estos productos nos ayudan a desarrollar de forma fácil interfaces gráficas con java y eclipse.

Que grande google!!!

Dejo links:

http://googlecode.blogspot.com
http://code.google.com/javadevtools/eclipse-donation-faq.html.

miércoles, 15 de diciembre de 2010

Masterbranch

Masterbranch es una pagina que contiene los cv de los programadores que participan en proyectos de software libre.

Lo que hace es recorrer los repositorios buscando info de los commiters y de esta forma tiene un banco de cv de gente que programa y si queda duda mira los commit del repositorio.

Muy buena idea, la verdad; también tiene la opcional de registrarse.

Dejo el link:

http://www.masterbranch.com


jeje

domingo, 5 de diciembre de 2010

Clojure


Clojure es Lisp en JVM. Es decir entendiendo Clojure entenderemos List, y entendiendo List entenderemos Clojure. Después de Fortran, List es el lenguaje más viejo. List es un lenguaje funcional pero no es un lenguaje puramente funcional.

Una de las más importantes características de Clojure es que corre en la JVM.

Deben bajar la consola para Clojure de http://clojure.org/ y empecemos haciendo un Hola Mundo!

user=> (println "Hola Mundo!")
Hola Mundo!
nil


Veamos llamadas a funciones:

user=> (- 1)
-1
user=> (+ 1 1)
2
user=> (* 10 10)
100
user=> (mod 5 4)
1
user=> (/ (/ 12 2) (/ 6 2))
2
user=> (+ 2 2 2 2)
8
user=> (- 8 1 2)
5
user=> (/ 8 2 2)
2
user=> (+ 3.0 5)
8.0
user=> (+ 3 5.0)
8.0

Clojure maneja los tipos de java:

user=> (class true)
java.lang.Boolean
user=> (class (= 1 1))
java.lang.Boolean

Podemos usar el condicional:

user=> (if true (println "True it is."))
True it is.
nil
user=> (if false (println "true") (println "false"))
false
nil

Veamos las listas:
user=> (list 1 2 3)
(1 2 3)
user=> '(1 2 3)
(1 2 3)

vectores:
user=> [:hutt :wookie :ewok]
[:hutt :wookie :ewok]

Mapas:
user=> {:chewie :wookie :lea :human}
{:chewie :wookie, :lea :human}

Definir funciones:
user=> (defn force-it [] (str "Use the force," "Luke."))
#'user/force-it
y usarla:
user=> (force-it)
"Use the force,Luke."

Este es un pequeño y humilde paseo por Clojure, si deben aplicar programación funcional en una aplicación Java es la herramienta justa.

Dejo links:
http://clojure.org/