20. Soluciones
Capítulo 1
Actividad 1
1958
Actividad 2
El árbol representa cómo se estructura el código. En concreto vemos una operación aritmética: 2 x (3 + 4). En Clojure se expresaría así.
(* 2 (+ 3 4))
Actividad 3
https://www.youtube.com/watch?v=YR5WdGrpoug&list=PLZdCLR02grLrEwKaZv-5QbUzK0zGKOOcr
Capítulo 2
Actividad 1
(prn (clojure.string/trim " ancha es Castilla "))
Actividad 2
(prn (if (= (rand-int 2) 0) "sí" "no"))
Actividad 3
-
Foro oficial: https://ask.clojure.org/
-
Clojurians Slack: https://clojurians.net/
-
Recursos de la comunidad: https://clojure.org/community/resources
Capítulo 5
Actividad 1
(- (Integer/parseInt (.format (java.text.SimpleDateFormat. "yyyy") (new java.util.Date))) 2007)
Actividad 2
(min 40 35 16 30)
; 16
Actividad 3
(/ (rand-int 2000) 2)
Actividad 4
(+ 5 (rand-int 6))
Capítulo 6
Actividad 1
Devuelve nil ya que comment siempre devuelve nil.
Actividad 2
Devolverá nil. Lo interesante es que puedes crear tantas líneas como necesites.
Capítulo 7
Actividad 1
(def nombre "Miguel de Cervantes")
(def edad 68)
(prn nombre edad)
Actividad 2
(def cartera 340)
(def cartera-con-impuesto (+ cartera (* cartera 0.21)))
(prn "Mi cartera:" cartera "Con impuestos:" cartera-con-impuesto)
Actividad 3
(def cloins (atom 0))
(reset! cloins 50)
(swap! cloins inc)
;; 51
Capítulo 8
Actividad 1
(defn contar-letras [palabra] (count palabra))
Actividad 2
(defn formatear-a-metros [num]
(str (float (/ num 100)) " m"))
Actividad 3
(defn capitalizar [& palabras]
(mapv clojure.string/capitalize palabras))
Capítulo 9
Actividad 1
(def personajes ["Don Quijote" "Sancho" "Dulcinea" "Rocinante" "Sansón"])
(get personajes 2)
;; "Dulcinea"
Actividad 2
(def persona {:nombre "Alonso" :edad 50 :profesion "Caballero"})
(assoc persona :ciudad "La Mancha")
;; {:nombre "Alonso", :edad 50, :profesion "Caballero", :ciudad "La Mancha"}
Actividad 3
(contains? #{"espada" "lanza" "escudo" "yelmo"} "lanza")
;; true
(disj #{"espada" "lanza" "escudo" "yelmo"} "escudo")
;; #{"espada" "lanza" "yelmo"}
Actividad 4
(def caballero {:nombre "Don Quijote"
:caballo {:nombre "Rocinante" :raza "Rocín"}})
(get-in caballero [:caballo :nombre])
;; "Rocinante"
Capítulo 10
Actividad 1
(defn signo [n]
(cond
(pos? n) "positivo"
(neg? n) "negativo"
:else "cero"))
Actividad 2
(defn traducir-dia [dia]
(case dia
"lunes" "Monday"
"martes" "Tuesday"
"miércoles" "Wednesday"
"jueves" "Thursday"
"viernes" "Friday"
"sábado" "Saturday"
"domingo" "Sunday"
"Día desconocido"))
Actividad 3
(defn factorial [n]
(loop [i n acc 1]
(if (<= i 1)
acc
(recur (dec i) (* acc i)))))
Capítulo 11
Actividad 1
(filter odd? [1 2 3 4 5 6 7 8 9 10])
;; (1 3 5 7 9)
Actividad 2
(reduce #(str %1 " " %2) ["Don" "Quijote" "de" "la" "Mancha"])
;; "Don Quijote de la Mancha"
Actividad 3
(for [arma [:espada :lanza]
metal [:oro :plata]]
[arma metal])
;; ([:espada :oro] [:espada :plata] [:lanza :oro] [:lanza :plata])
Capítulo 12
Actividad 1
(take 20 (iterate #(+ % 7) 7))
;; (7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140)
Actividad 2
(take 10 (iterate #(* % 2) 1))
;; (1 2 4 8 16 32 64 128 256 512)
Capítulo 13
Actividad 1
(ns aventura.caballero
(:require [clojure.string :as str]))
(defn gritar-nombre [nombre]
(str/upper-case nombre))
(gritar-nombre "Don Quijote")
;; "DON QUIJOTE"
Capítulo 14
Actividad 1
(->> (range 1 11)
(filter even?)
(map #(* % %))
(reduce +))
;; 220
Actividad 2
(-> {:nombre "Quijote"}
(assoc :edad 50)
(update :edad inc))
;; {:nombre "Quijote", :edad 51}
Capítulo 15
Actividad 1
(defn palindromo? [palabra]
(= palabra (clojure.string/reverse palabra)))
(deftest test-palindromo
(is (true? (palindromo? "oso")))
(is (true? (palindromo? "radar")))
(is (false? (palindromo? "clojure"))))
Capítulo 16
Actividad 1
(let [f1 (future (Thread/sleep 1000) "respuesta 1")
f2 (future (Thread/sleep 1000) "respuesta 2")
f3 (future (Thread/sleep 1000) "respuesta 3")]
[@f1 @f2 @f3])
;; ["respuesta 1" "respuesta 2" "respuesta 3"]
;; Tarda ~1 segundo en total, no 3
Actividad 2
(pmap #(* % %) (range 1 11))
;; (1 4 9 16 25 36 49 64 81 100)
Capítulo 17
Actividad 1
(macroexpand-1 '(and true false true))
;; (let [and__5579__auto__ true] (if and__5579__auto__ (clojure.core/and false true) and__5579__auto__))
and es un macro que evalúa de izquierda a derecha y se detiene en el primer valor falso.
Actividad 2
(defmacro si [condicion entonces sino]
`(if ~condicion ~entonces ~sino))
(si true "victoria" "derrota")
;; "victoria"
Capítulo 18
Actividad 1
Crea la estructura:
mi-proyecto/
├── deps.edn
└── src/
└── mi_proyecto/
└── core.clj
deps.edn:
{:paths ["src"]
:deps {org.clojure/clojure {:mvn/version "1.12.0"}}}
src/mi_proyecto/core.clj:
(ns mi-proyecto.core
(:gen-class))
(defn -main [& args]
(println "¡Hola Clojure!"))
Ejecuta con:
clojure -M -m mi-proyecto.core
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Support me on Ko-fi