Skip to content
JRaul edited this page Apr 6, 2012 · 7 revisions

#Empezando

Bueno ya tenemos instalado clojure en nuestro sistema vamos a abrir la consola he iniciar,

clj Clojure 1.3.0

User=> Ya podemos iniciar a programar.

Cada comando que ejecutemos en la consola nos pondra User=> por lo que para los siguientes ejemplos lo ignoraremos.

Aritmetica Iniciemos con simple aritmética.

(+ 2 2)
4
(* 3 4)
12
(quot 5 2) 
2
(/ 5 2) 
5/2
(/ 5.0 2) 
2.5
(- 50 25) 
25

Clojure la division con el simbolo / se expresa como fraccion(5/2),si los numeros son enteros,si uno de los numeros es con punto decimal,el resultado sera con punto decimal y con quot se usa para division entera.

Como podemos ver Clojure tiene construcciones para fracciones y las operaciones son en forma posfija. En caso de querer hacer múltiples operaciones. Se evalua primero el resultado entre parentesis.

(+ (* 5 3) (- 2 20))
-3
(/ (* 3 3) (* 7 6)) 
3/14

En el primer caso (+ (*5 3) (- 2 20) ) => (+ 15 -18)=>-3

En el segundo (/ (* 3 3) (* 7 6) ) => (/ 9 42) => 3/14

##Booleanos

Operadores booleanos clojure usa true(verdadero) y false(falso),los operadores lógicos and(y),or(o),not(no).

(and true true)
true
(or true false)
true
(not true)
false
(not (and true false))
true
(or (and true false) (and true true))
true

Aunque los operadores lógicos también and y or también aceptan más de dos parámetros en caso de and solo es verdadero si todos los parámetros son verdaderos y en caso de or si al menos un parámetro es verdadero entonces es verdadero.

(and true true true)
true
(and false true true)
false
(or false false true)
true

Variables:

Definiciones locales: Si necesitamos declarar una variable,podemos usar def.

(def dos (2))
dos
2
(* 10 dos)
20

##Funciones: En los lenguajes funcionales están basados principalmente en funciones parecidas a los funciones matemáticas. Entre corchetes los argumentos Se crea una funcion con nombre

(fn duplicar [x] (* 2 x))

;;Una funcion anonima(Sin nombre)

(fn[x] (* 2 x))

;;Una forma mas corta de escribir una funcion anonima.
;;En este caso el argumento es % en caso de que solo se pase un argumento a la funcion.
;;En caso 2 o mas toman la forma de %1,%2..%n ,para n argumentos.

#(* %)

;;Aunque estas funciones no estan disponibles en el scope,tenemos que definirla como las variables

(def duplicar (fn duplica[x] (* x x) ))


;;O Clojure ya proporciona una forma de declarar funciones,mas su documentacion.

(defn duplicar[x]

"Duplica un numero"

(* 2 x))

Pitagoras a b = aa +bb

En Clojure:

(defn pitagoras [a b]

( + (* a a) (* b b) ) )

En clojure por norma las funciones que regresan booleanos se nombran un el signo de ? al final del nombre.

(defn triangulo-rectangulo? [a b c]
(= (pitagoras a b) c))

Podemos hacer funciones mucho mas complejas,uniendo otras,en los lenguajes de programacion imperativos tenemos estructuras de control(if,swich) e interacion(while,for),los lenguajes funcionales prefieren un la combinacion de funciones en vez del orden secuencial de la programacion estructurada.

La funcion condicional en Clojure

(if condicion -si se cumple- -si no se cumple-)

(if (= 2 2) "Estas bien" "Estas mal")

"Estas bien"

(defn es-par[n]
 (if (= (mod n 2) 0) "Es par" "No es par") )

(es-par 3)

"No es par"

Si tenemos dos jugadores a y b cada uno con un puntaje,el que tiene el mayor puntaje gana,si tiene el mismo empatan,vamos a ver como hacer esta funcion.

(defn resultado[ a puntaje-a b puntaje-b]
      (if (> puntaje-a puntaje-b) (str "Gana" " " a)
       (if(< puntaje-a puntaje b) (str "Gana" " " b) 
             (str "Empate entre" " " a " " "y" " " b) ))

La funcion str concatena cadenas.

El uso de if parece algo engoros tambien tenemos la funcion cond.

(cond -Condicion- resultado -Condicion-2- resultado-2 ...)

cond toman pares de condicion,resultado ,regresa el resultado de la primera condicion que regrese verdadero.

Reescribiendo nuestro ejemplo tendriamos

(defn resultado[ a puntaje-a b puntaje-b]
 (cond (> puntaje-a puntaje-b) (str "Gana" " " a)
       (< puntaje-a puntaje b) (str "Gana" " " b)
:else (str "Empate entre" " " a " " "y" " " b) )
Clone this wiki locally