20. Soluciones

Capítulo 1

Actividad 1

1958

Actividad 2

S-expressions

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

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

Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.

¿Me invitas a un café?

Visitantes en tiempo real

Estás solo: 🐱