Anda di halaman 1dari 10

Programación Clojure

Clojure es un lenguaje de programación funcional que corre bajo la JVM, se considera un dialecto de
Lisp.

¿Cómo ejecuto un programa en Clojure (desde la terminal de comandos)?


java -jar clojure_version.jar Programa.cjl

La extensión del archivo es *.cjl

¿Cómo quedaría el "hola mundo" en Clojure?


Creamos un archivo llamado holamundo.cjl escribimos lo siguiente:

;; esto es un comentario
(println "hola mundo!")

Lo ejecutamos:
java -jar clojure_version.jar holamundo.cjl

Tenemos nuestro primer script en este lenguaje.

REPL (Read Eval Print Loop) en Clojure


Para entrar al REPL debes teclear:
java -jar clojure_version.jar

Saldrá algo como esto:

Clojure 1.5.1
user =>

Ya puedes comenzar haciendo pruebas.

user => (println "hola mundo")


hola mundo
nil
user => (+ 3 4 5)
12
user => (* 4 (+ 5 6) )
44
user => (def cadena "Una introduccion a Clojure")
#' user/ cadena
user => (println cad)
Una introduccion a Clojure
nil
Para salir teclea Ctrl + C en Windows, y Ctrl + D en Linux.

A mi parecer Clojure es un lenguaje algo complejo, como lo puede ser el uso de paréntesis, los
operadores,definir variables y funciones. Pero no es imposible de aprender. Tan solo hay que practicar
bastante.

Links:
Descarga: http://clojure.org/
Twitter del creador del lenguaje:https://twitter.com/richhickey

;; java -jar
clojure.jar
matematico.cjl

;;0. Ejecutar programa (desde terminal):


(comment

Esto es un comentario
multilínea
)
java -jar clojure_version.jar matematico.cjl

;;1. Hola mundo (esto es un comentario)


(println "Hola, Mundo")

;;2. Uso de Scanner


(import '(java.util Scanner))
(def scan (Scanner. *in*))
(println "Tu nombre: ")
(def nombre (.nextLine scan))
(def resultado(if (="Ernesto" nombre) "Eres Ernesto" "No eres
Ernesto"))
(println resultado)

;;3. Uso de loop


(loop [cont 0]
(when (< cont 5)
(println "no. " cont)
(recur (inc cont))))

;;4. Más de Scanner


;;importamos la librería java.util.Scanner
(import '(java.util Scanner))
(def scan (Scanner. *in*))
;;solicitamos distancia y tiempo, usamos .nextFloat
(println "Introduce distancia: ")
(def distancia (.nextFloat scan))
(println "Introduce tiempo: ")
(def tiempo (.nextFloat scan))
;;visualizamos datos
(println "Distancia leida: "distancia)
(println "Tiempo leido: "tiempo)
;;calculamos la velocidad
(println "Velocidad obtenida: "(/ distancia tiempo))

;;5. Uso de case


;;importamos la librería java.util.Scanner
(import '(java.util Scanner))
(def entrada (Scanner. *in*))

;;solicitamos un número del 1 al 3


(println "Introduce un número del 1 al 3:")
(def numero (.nextLine entrada))

;;nuestro 'switch'
(case numero
"1" (println "Introduciste el numero 1")
"2" (println "Introduciste el numero 2")
"3" (println "Introduciste el numero 3")
(str "else" numero(println "Ese numero no esta en el rango"))
)

;;6. Crear una 'clase' Fecha, con tres propiedades: dia,mes, y año
;;importamos la librería java.util.Scanner para introducir datos
(import '(java.util Scanner))
(def entrada(Scanner. *in*))

;;creamos una interface para mostrar los valores tecleados


(defprotocol Servicio
(verFecha[this]))

;;creamos la 'clase' Fecha e implementamos la interface Servicio


(defrecord Fecha[dia mes anyo]
Servicio
(verFecha[this](println "Fecha: { dia:"dia" -mes: "mes" -
anyo:"anyo"}")))

;; probamos
(try
(def miFecha(Fecha. "23" "agosto" "1943"))
(verFecha miFecha)

(println "Dia:")
(def dia(.nextLine entrada))
(println "Mes:")
(def mes(.nextLine entrada))
(println "Anyo:")
(def anyo(.nextLine entrada))
(def miFecha2(Fecha. dia mes anyo))
(verFecha miFecha2)

(catch Exception e (str "ha ocurrido una excepcion: " (.getMessage


e))))

;;7. Funciones
;;defino las funciones
(defn obtenerImc [p,t]
(/ p (* t t)))

(defn obtenerPeso [t,i]


(* i (* t t)))

(defn obtenerTalla [p,i]


(Math/sqrt (/ p i)))

;;defino dos variables: peso e imc


(def peso 74.8)
(def imc 18.0)

(try
(println "talla ideal:" (obtenerTalla peso imc))
(catch Exception e (str "error: " (.getMessage e)))
)

;;8. Funciones
;;mostrar un mensaje, no devuelve ningún valor
(defn mensaje
(println "Este es un simple mensaje")
)

;;sumar dos números, devuelve el resultado


(defn suma [x1, x2]
(+ x1 x2)
)

;;Invocamos las funciones:

(mensaje )
(suma 23 45);;suma: 68

;;9. Uso de javax.swing.*


;;importamos la librería
(import '(javax.swing JOptionPane)) ;'
;;hacemos uso de JOptionPane.showMessageDialog(null, "Algo")
(JOptionPane/showMessageDialog nil,
(str "Mensaje desde Clojure")
)

;;10. Más de javax.swing.*


(import '(javax.swing JOptionPane));'
;; obtenemos el nombre del SO
(def sistema(. (. System (getProperties)) (get "os.name")))

(JOptionPane/showMessageDialog nil,
(str "Estas usando "sistema)
)

;;10. JOptionPane en clojure


;;importar librería
(import '(javax.swing JOptionPane));'

;;defino el método introduceDato


(defn introduceDato []
(JOptionPane/showInputDialog
(str "Introduce una cadena:")
)
)

;;lo usamos así


(def entrada (introduceDato))

;;imprimimos
(JOptionPane/showMessageDialog nil,
(str "Cadena: "entrada)
)

;;11. Más de JOptionPane


(import '(javax.swing JOptionPane));'
(defn esMenor? [n]
(if (< n 100) (JOptionPane/showMessageDialog nil,
(str n" es menor a 100")
) (JOptionPane/showMessageDialog nil,
(str n" es mayor a 100")
) )
)

;;parseInt
(defn pasaEntero [s]
(Integer. (re-find #"\d+" s)))

(def entrada "3")


;;'main' del programa
(try
(esMenor? (pasaEntero entrada))
(catch Exception e (str "error: " (.getMessage e)))

;;12. Cuadrado de un número


(import '(javax.swing JOptionPane));'

(defn introduceDato [s]


(JOptionPane/showInputDialog
(str s)
)
)

(def numero(introduceDato "Introduce numero:"))


;;convertir String a número
(defn String->Number [str]
(let [n (read-string str)]
(if (number? n) n nil)))

;;función cuadrado
(defn cuadrado [n]
(* n n)
)

;;'main' del programa


(try

(JOptionPane/showMessageDialog nil,
(str "El numero introducido es: "numero)
)

(JOptionPane/showMessageDialog nil,
(str "Al cuadrado es: "(cuadrado (String->Number numero)))
)

(catch Exception e (str "error: " (.getMessage e)))


)

;;13. Más de JOptionPane


;;Importamos la librería javax.swing
(import '(javax.swing JOptionPane));'

(try

;; variable "pregunta"
(def pregunta
(JOptionPane/showConfirmDialog nil,
(str "Estas de acuerdo en que Clojure es mejor que Lisp?")
)
)

;;la variable pregunta devolverá un valor entre 0, si es OK; 1, si


es No; 2, si es Cancelar
(if (= pregunta 0)

(JOptionPane/showMessageDialog nil,
(str "Bien, estas de acuerdo")
)

(if (= pregunta 1)
(JOptionPane/showMessageDialog nil,
(str "Claro, entiendo que no todos pueden estar de
acuerdo")
)

((JOptionPane/showMessageDialog nil,
(str "Operacion cancelada"))
)

(catch Exception e (str "error: " (.getMessage e)))


)

;; 14. Disparejo
;;1 Juego del disparejo
(comment

Juego del disparejo en Clojure


)

(def hugo (rand-int 2))


(def paco (rand-int 2))
(def luis (rand-int 2))

(try
(if (= hugo 0) (println "Hugo:SOL") (println "Hugo:AGUILA"))
(if (= paco 0) (println "Paco:SOL") (println "Paco:AGUILA"))
(if (= luis 0) (println "Luis:SOL") (println "Luis:AGUILA"))

(if (and (= hugo luis) (= hugo paco))


(println "No hay ganadores")
(if (and (not= hugo luis) (not= hugo paco))
(println "El ganador es Hugo")
(if (and (not= paco luis) (not= paco hugo))
(println "El ganador es Paco")
(if (and (not= luis paco) (not= luis hugo))
(println "El ganador es Luis")
);;cuarto if
);;tercer if
);;segundo if
);;primer if

(catch Exception e (prn "Error: "e))


)

Anda mungkin juga menyukai