Funciones
Listado y ejemplos
Números:
+
: suma.-
: resta.*
: múltiplicación./
: división.=> (let [a 1000 b 200 c 5 d 1] [(+ a b c d) (- a b c d) (* a b c d) (/ a b c d)]) [1206 794 1000000 1] => (let [a 0.1 b 0.2 c 100] [(+ a b) (/ (+ (* a c) (* b c)) c)]) [0.30000000000000004 0.3] => (let [a 10/4 b 1/3] [(+ a b) (- a b) (* a b) (/ a b)]) [17/6 13/6 5/6 15/2]
quot
: el cociente de la división.rem
: el resto de la división.=> (let [a 100 b 30 c 2] [[(quot a b) (rem a b)] [(quot a c) (rem a c)]]) [[3 10] [50 0]]
inc
: incremento en uno.dec
: decremento en uno.max
: el número mayor.min
: el número menor.=> (let [a 5 b 10 c 15] [[(dec (min a b c)) (inc (min c b a))] [(dec (max a b c)) (inc (max c b a))]]) [[4 6] [14 16]]
Relación:
==
: igualdad.<
: menor a.>
: mayor a.<=
: menor o igual a.>=
: mayor o igual a.=> (let [a 10 b 50/5 c 10.0 d 20 e 30] [(== a b c) (< a d e) (> e d a) (<= a b c d e) (>= e d c b a)]) [true true true true true]
Predicado:
zero?
: ¿es igual a cero?.pos?
: ¿es positivo?.neg?
: ¿es negativo?.even?
: ¿es par?.odd?
: ¿es impar?.number?
: ¿es un número (entero, racional, fraccionario, de coma/punto flotante o decimal)?.integer?
: ¿es un número entero?.rational?
: ¿es un número racional?.ratio?
: ¿es un número fraccionario (fracción)?.float?
: ¿es un número de coma/punto flotante o decimal?.=> (let [a 0 b 0.0 c -5 d 5 e 6 f 2/3 g 9/3] [[(zero? a) (zero? b)] [(neg? c) (pos? d)] [(odd? d) (even? e)] [(number? b) (number? d) (number? f) (number? g)] [(integer? b) (integer? d) (integer? f) (integer? g)] [(rational? b) (rational? d) (rational? f) (rational? g)] [(ratio? b) (ratio? d) (ratio? f) (ratio? g)] [(float? b) (float? d) (float? f) (float? g)]]) [[true true] [true true] [true true] [true true true true] [false true false true] [false true true true] [false false true false] [true false false false]]
Generación:
rand
: regresa un número de coma/punto flotante aleatorio entre 0.0 y n (1.0, por default).rand-int
: regresa un número entero aleatorio entre 0 y n.=> (let [a 100 b 200] [[(rand) (rand a)] [(rand-int a) (rand-int b)]]) [[0.31931038559080016 44.938044601329985] [32 184]]
char
: convierte un número entero positivo en su representación de carácter en base a los caracteres de Unicode.=> (let [a 32 b 65 c 97 d 955 e 9733 f 9775 g 9829 h 11035 i 11044 j 12196] [(char a) (char b) (char c) (char d) (char e) (char f) (char g) (char h) (char i) (char j)]) [\space \A \a \λ \★ \☯ \♥ \⬛ \⬤ \⾤]
Booleanos:
not
: negación.and
: conjunción.or
: disyunción.=> (let [a true b false c true d false e true f false] [[(not a) (not b)] [(and a c e) (and a b c e)] [(or b d f) (or b c d f)]]) [[false true] [true false] [false true]]
Predicado:
true?
: ¿es igual a true?.false?
: ¿es igual a false?.=> (let [a true b false] [[(true? a) (true? b)] [(false? a) (false? b)]]) [[true false] [false true]]
Caracteres:
int
: convierte un carácter en su representación de número entero positivo en base a los caracteres de Unicode.=> (let [a \space b \A c \a d \λ e \★ f \☯ g \♥ h \⬛ i \⬤ j \⾤] [(int a) (int b) (int c) (int d) (int e) (int f) (int g) (int h) (int i) (int j)]) [32 65 97 955 9733 9775 9829 11035 11044 12196]
Predicado:
char?
.=> (let [a 5 b \5 c "5"] [(char? a) (char? b) (char? c)]) [false true false]
Nil:
Predicado:
nil?
.=> (let [a nil b 0 c false d "" e '()] [(nil? a) (nil? b) (nil? c) (nil? d) (nil? e)]) [true false false false false]
Colecciones:
Listas:
list
: regresa una lista a partir de sus argumentos dados.nth
: regresa el n-avo elemento de la lista. 0 es el primero, 1 es el segundo, etc.list?
: ¿es una lista?.=> (let [a 10 xs (list a (* 2 a) (* 3 a) (* 4 a) (* 5 a))] [xs (nth xs 2) (nth xs 7 80) (list? xs)]) [(10 20 30 40 50) 30 80 true]
Vectores:
vector
: regresa un vector a partir de sus argumentos dados.nth
: regresa el n-avo elemento del vector. 0 es el primero, 1 es el segundo, etc.subvec
: regresa un vector con los elementos encontrados entre los índices dados, exceptuando el índice final dado.vector?
: ¿es un vector?.mapv
: aplica una función sobre cada uno de los elementos encontrados en la colección dada, regresando un vector con los resultados obtenidos.filterv
: aplica un predicado sobre cada uno de los elementos encontrados en la colección dada, regresando un vector con los elementos que cumplan el predicado.vec
: regresa un vector a partir de los elementos de la colección dada.=> (let [a 10 xs (vector a (* 2 a) (* 3 a) (* 4 a) (* 5 a))] [xs (nth xs 2) (nth xs 7 80) (subvec xs 1 3) (vector? xs)]) [[10 20 30 40 50] 30 80 [20 30] true] => (let [a 10 xs (vector a (* 2 a) (* 3 a) (* 4 a) (* 5 a))] [xs (mapv (fn [x] (* 2 x)) xs) (filterv (fn [x] (and (>= x 20) (<= x 40))) xs)]) [[10 20 30 40 50] [20 40 60 80 100] [20 30 40]] => (let [xs [10 20 30 40] ys [60 70 80 90]] [(mapv (fn [x] (+ x 500)) xs) (mapv (fn [x y] (+ x y)) xs ys) (filterv (fn [x] (and (>= x 20) (<= x 40))) xs) (filterv (fn [x] (and (>= x 60) (<= x 80))) ys)]) [[510 520 530 540] [70 90 110 130] [20 30 40] [60 70 80]] => (let [xs #{10 20 30 40 50} ys {:a 10 :b 20 :c 30 :d 40 :e 50} zs "¡Hola mundo!"] [(vec xs) (vec ys) (vec zs)]) [[20 50 40 30 10] [[:a 10] [:b 20] [:c 30] [:d 40] [:e 50]] [\¡ \H \o \l \a \space \m \u \n \d \o \!]]
Vector como función:
(un-vector índice)
=> (let [xs [10 20 30 40 50]] [(xs 0) (xs 2) (xs 4)]) [10 30 50]
Conjuntos:
hash-set
: regresa un conjunto a partir de sus argumentos dados, sin mantener su orden internamente.sorted-set
: regresa un conjunto a partir de sus argumentos dados, manteniendo su orden internamente.=> (let [x 10 xs (sorted-set (* 3 x) (* 5 x) x (* 4 x) (* 2 x))] xs) #{10 20 30 40 50}
set
: regresa un conjunto a partir de los elementos de la colección dada. Los elementos repetidos en la colección dada son descartados en el conjunto regresado.=> (let [a 10 xs (hash-set a (* 2 a) (* 3 a) (* 4 a) (* 5 a)) ys (set [50 40 40 30 20 20 50 30 20 10])] [xs ys]) [#{20 50 40 30 10} #{20 50 40 30 10}]
disj
: regresa un conjunto a partir de un conjunto dado (como primer argumento), sin incluir el resto de argumentos dados.=> (let [a 10 xs (hash-set a (* 2 a) (* 3 a) (* 4 a) (* 5 a)) ys (disj xs 20 40)] [xs ys]) [#{20 50 40 30 10} #{50 30 10}]
clojure.set/union
: regresa un conjunto a partir de la unificación de los conjuntos dados:=> (let [as #{10 20 30 40 50} bs #{10 20 30 40 50} cs #{10 20 30} ds #{10 20 30 60 70} es #{60 70 80 90 100}] [(clojure.set/union as bs) (clojure.set/union as cs) (clojure.set/union as ds) (clojure.set/union as es)]) [#{20 50 40 30 10} #{20 50 40 30 10} #{70 20 60 50 40 30 10} #{70 20 60 50 40 90 100 30 10 80}] => (let [as #{10 20 30 40 50 60 70 80 90} bs #{80 40 60 20} cs #{100 110 120 130 140 150} ds #{90 20 10 40 100}] (clojure.set/union as bs cs ds)) #{70 110 130 20 60 50 40 90 150 100 140 120 30 10 80}
clojure.set/difference
: regresa un conjunto a partir del primer conjunto dado eliminando sus elementos que se encuentren en el resto de conjuntos dados.=> (let [as #{10 20 30 40 50} bs #{10 20 30 40 50} cs #{10 20 30} ds #{10 20 30 60 70} es #{60 70 80 90 100}] [(clojure.set/difference as bs) (clojure.set/difference as cs) (clojure.set/difference as ds) (clojure.set/difference as es)]) [#{} #{50 40} #{50 40} #{20 50 40 30 10}] => (let [as #{10 20 30 40 50 60 70 80 90} bs #{80 40 60 20} cs #{100 110 120 130 140 150} ds #{90 20 10 40 100}] (clojure.set/difference as bs cs ds)) #{70 50 30}
clojure.set/intersection
: regresa un conjunto con todos los elementos a partir del primer conjunto dado que también se encuentren en el resto de conjuntos dados.=> (let [as #{10 20 30 40 50} bs #{10 20 30 40 50} cs #{10 20 30} ds #{10 20 30 60 70} es #{60 70 80 90 100}] [(clojure.set/intersection as bs) (clojure.set/intersection as cs) (clojure.set/intersection as ds) (clojure.set/intersection as es)]) [#{20 50 40 30 10} #{20 30 10} #{20 30 10} #{}] => (let [as #{10 20 30 40 50 60 70 80 90} bs #{80 40 60 20} cs #{100 110 120 130 140 150} ds #{90 20 10 40 100}] [(clojure.set/intersection as bs) (clojure.set/intersection as bs cs) (clojure.set/intersection as ds bs)]) [#{20 60 40 80} #{} #{20 40}]
clojure.set/subset?
: ¿el primer conjunto dado es subconjunto del segundo conjunto dado?=> (let [as #{10 20 30 40 50} bs #{10 20 30 40 50} cs #{10 20 30} ds #{10 20 30 60 70} es #{60 70 80 90 100}] [(clojure.set/subset? as bs) (clojure.set/subset? as cs) (clojure.set/subset? as ds) (clojure.set/subset? as es)]) [true false false false]
clojure.set/superset?
: ¿el primer conjunto dado es superconjunto del segundo conjunto dado?=> (let [as #{10 20 30 40 50} bs #{10 20 30 40 50} cs #{10 20 30} ds #{10 20 30 60 70} es #{60 70 80 90 100}] [(clojure.set/superset? as bs) (clojure.set/superset? as cs) (clojure.set/superset? as ds) (clojure.set/superset? as es)]) [true true false false]
clojure.set/select
: dado un predicado y un conjunto regresa un conjunto con los elementos del conjunto dado que cumplan el predicado dado.=> (let [xs #{10 20 30 40 50}] (clojure.set/select (fn [x] (and (>= x 20) (<= x 40))) xs)) #{20 40 30}
clojure.set/map-invert
: dado un mapa regresa un mapa donde invierte los valores en llaves y las llaves en valores del mapa dado.=> (let [xs {:a 10 :b 20 :c 30}] (clojure.set/map-invert xs)) {10 :a, 20 :b, 30 :c}
Conjunto como función:
(un-conjunto elemento)
=> (let [xs #{10 20 30 40 50}] [(xs 10) (xs 30) (xs 50) (xs 60) (xs 80) (xs 100)]) [10 30 50 nil nil nil]
Mapas:
hash-map
: regresa un mapa a partir de los argumentos dados, los cuales son tomados como pares: primero la llave y luego el valor asociado a la llave.=> (let [x 10 xs (hash-map x (inc x) (* 2 x) (inc (* 2 x)) (* 3 x) (inc (* 3 x)) (* 4 x) (inc (* 4 x)) (* 5 x) (inc (* 5 x)))] xs) {20 21, 50 51, 40 41, 30 31, 10 11}
zipmap
: regresa un mapa a partir de dos colecciones, la primera siendo las llaves y la segunda siendo los valores asociados a las llaves.=> (let [as [10 20 30] bs [40 80 120] cs #{40 80 120} ds {:a 40 :b 80 :c 120}] [(zipmap as bs) (zipmap as cs) (zipmap as ds)]) [{10 40, 20 80, 30 120} {10 40, 20 120, 30 80} {10 [:a 40], 20 [:b 80], 30 [:c 120]}]
Mapa como función:
(un-mapa llave)
=> (let [xs {:a 10 :b 20 :c 30 :d 40 :e 50}] [(xs :a) (xs :c) (xs :e) (xs :f) (xs :g) (xs :h)]) [10 30 50 nil nil nil]
Secuencias:
map
,filter
,reduce
.Asociaciones:
get
,assoc
,assoc-in
,replace
,update
,update-in
,reduce-kv
,contains?
.get
:=> (let [xs {:a 10 :b 20 :c 30}] [(get xs :a) (get xs :b) (get xs :c) (get xs :d) (get xs :e) (get xs :f 40) (get xs :g 50)]) [10 20 30 nil nil 40 50]
frequencies
:=> (let [xs [10 20 10 30 20 10 40 50 10 50] ys #{10 20 30 40 50} zs {:a 10 :b 20 :c 30 :d 20 :e 10}] [(frequencies xs) (frequencies ys) (frequencies zs)]) [{10 4, 20 2, 30 1, 40 1, 50 2} {20 1, 50 1, 40 1, 30 1, 10 1} {[:a 10] 1, [:b 20] 1, [:c 30] 1, [:d 20] 1, [:e 10] 1}]
Cadenas de caracteres:
str
: regresa una cadena de caracteres conformada por la concatenación de la representación como cadena de caracteres de cada uno de sus argumentos dados, respetando el orden en que fueron dados.=> (let [a 123 b 4.5 c true d \@ e "HOLA MUNDO" f [10 20 30] g #{10 20 30} h {:a 10 :b 20 :c 30} i '(10 20 30)] [(str) (str a b) (str c d e) (str f g h i)]) ["" "1234.5" "true@HOLA MUNDO" "[10 20 30]#{20 30 10}{:a 10, :b 20, :c 30}(10 20 30)"]
count
: regresa la cantidad de caracteres que conforman la cadena de caracteres.get
: regresa el n-avo carácter de la cadena de caracteres.=> (let [x "¡Hola mundo!"] [(count x) [(get x 1) (get x 3) (get x 5) (get x 15 \@)]]) [12 [\H \l \space \@]]
subs
(subcadena): dada una cadena de caracteres, un inicio y un fin, regresa una cadena de caracteres conformada por los caracteres encontrados entre inicio y fin (excluido).=> (let [x "¡Hola mundo!"] [(subs x 0) (subs x 3 9) (subs x 6 12) (subs x 9)]) ["¡Hola mundo!" "la mun" "mundo!" "do!"]
string?
: ¿es una cadena de caracteres?.=> (let [a 5 b \5 c "5" d [5] e #{5}] [(string? a) (string? b) (string? c) (string? d) (string? e)]) [false false true false false]
clojure.string/blank?
: ¿es una cadena de caracteres vácia o contiene solo espacios en blanco (caracteres no imprimibles)?=> (let [x "¡Hola mundo!" y "" z " \t \r \n \t"] [(clojure.string/blank? x) (clojure.string/blank? y) (clojure.string/blank? z)]) [false true true]
clojure.string/join
: dado un separador (opcionalmente) y una colección, regresa una cadena de caracteres conformada por la representación de los elementos de la colección intercalando el separador entre ellos.=> (let [a \| xs [10 20 30] ys #{10 20 30} zs {:a 10 :b 20 :c 30}] [(clojure.string/join a xs) (clojure.string/join a ys) (clojure.string/join a zs)]) ["10|20|30" "20|30|10" "[:a 10]|[:b 20]|[:c 30]"]
clojure.string/escape
: dada una cadena de caracteres y una función o un mapa, usa la función o el mapa dado para sustituir cada carácter en la cadena de caracteres dada, regresando una cadena de caracteres.=> (let [x "¡Hola mundo!" y "ACEGIKMÑPRTV" z "abcdefghijkl"] [(clojure.string/escape x (fn [x] nil)) (clojure.string/escape y (fn [x] (char (inc (int x))))) (clojure.string/escape z (fn [x] (char (+ 13 (int x))))) (clojure.string/escape x {\H \h \space \| \¡ \! \! \¡}) (clojure.string/escape y {\A \4 \I 1 \T \7}) (clojure.string/escape z {\a \4 \b \8 \e \3 \i \1 \l \1}) (clojure.string/escape x {\¡ "¡¡¡" \! "!!!"})]) ["¡Hola mundo!" "BDFHJLNÒQSUW" "nopqrstuvwxy" "!hola|mundo¡" "4CEG1KMÑPR7V" "48cd3fgh1jk1" "¡¡¡Hola mundo!!!"]
clojure.string/reverse
: dada una cadena de caracteres regresa una cadena de caracteres con los caracteres invertidos en su orden dentro de la cadena de caracteres dada.=> (let [x "¡Hola mundo!" y "ABCDEfghijkl" z "001122334455"] [(clojure.string/reverse x) (clojure.string/reverse y) (clojure.string/reverse z)]) ["!odnum aloH¡" "lkjihgfEDCBA" "554433221100"]
clojure.string/index-of
: dada una cadena de caracteres y un carácter u otra cadena de caracteres, regresa la posición a partir de la cual se encuentra, por primera vez, el carácter o la otra cadena de caracteres dada. Regresa nil en caso de no encontrarse.=> (let [x "¡Hola mundo!"] [(clojure.string/index-of x \a) (clojure.string/index-of x \space) (clojure.string/index-of x \o) (clojure.string/index-of x "mun") (clojure.string/index-of x " ") (clojure.string/index-of x "!") (clojure.string/index-of x \@) (clojure.string/index-of x "ñ")]) [4 5 2 6 5 11 nil nil]
clojure.string/index-of
: similar aclojure.string/index-of
pero regresa la posición a partir de la cual se encuentra por última vez el carácter o la otra cadena de caracteres dada.=> (let [x "¡Holaaaaa mundooooo!"] [(clojure.string/last-index-of x \a) (clojure.string/last-index-of x \space) (clojure.string/last-index-of x \o) (clojure.string/last-index-of x "mun") (clojure.string/last-index-of x " ") (clojure.string/last-index-of x "!") (clojure.string/last-index-of x \@) (clojure.string/last-index-of x "ñ")]) [8 9 18 10 9 19 nil nil]
clojure.string/capitalize
:=> (let [x "hola mundo" y "¡hola mundo!" z "¡HOLA MUNDO!"] [[(clojure.string/capitalize x) (clojure.string/capitalize y) (clojure.string/capitalize z)] [(clojure.string/lower-case x) (clojure.string/lower-case y) (clojure.string/lower-case z)] [(clojure.string/upper-case x) (clojure.string/upper-case y) (clojure.string/upper-case z)]]) [["Hola mundo" "¡hola mundo!" "¡hola mundo!"] ["hola mundo" "¡hola mundo!" "¡hola mundo!"] ["HOLA MUNDO" "¡HOLA MUNDO!" "¡HOLA MUNDO!"]] => (let [a \o b \O c \ó d \Ó e \ö f \Ö g \ô h \Ô i \õ] [[(clojure.string/capitalize a) (clojure.string/capitalize b) (clojure.string/capitalize c)] [(clojure.string/lower-case d) (clojure.string/lower-case e) (clojure.string/lower-case f)] [(clojure.string/upper-case g) (clojure.string/upper-case h) (clojure.string/upper-case i)]]) [["O" "O" "Ó"] ["ó" "ö" "ö"] ["Ô" "Ô" "Õ"]]
clojure.string/triml
: dada una cadena de caracteres regresa una cadena de caracteres con los espacios en blanco encontrados a la derecha (inicio) de la cadena de caracteres dada.clojure.string/trimr
: dada una cadena de caracteres regresa una cadena de caracteres con los espacios en blanco encontrados a la izquierda (fin) de la cadena de caracteres dada.clojure.string/triml
: dada una cadena de caracteres regresa una cadena de caracteres con los espacios en blanco encontrados tanto a la derecha (inicio) como a la izquierda (fin) de la cadena de caracteres dada.=> (let [x " ¡Hola mundo! "] [(clojure.string/triml x) (clojure.string/trimr x) (clojure.string/trim x)]) ["¡Hola mundo! " " ¡Hola mundo!" "¡Hola mundo!"]
clojure.string/starts-with?
: dadas dos cadenas de caracteres regresa true si la primera contiene a la segunda en su inicio (derecha).clojure.string/ends-with?
: dadas dos cadenas de caracteres regresa true si la primera contiene a la segunda en su fin (izquierda).clojure.string/includes?
: dadas dos cadenas de caracteres regresa true si la primera contiene a la segunda en cualquier parte.=> (let [x "¡Hola mundo!" y "¡Hola" z "mundo!"] [[(clojure.string/starts-with? x y) (clojure.string/starts-with? x z)] [(clojure.string/ends-with? x y) (clojure.string/ends-with? x z)] [(clojure.string/includes? x y) (clojure.string/includes? x z)]]) [[true false] [false true] [true true]]
Funciones:
identity
(Función identidad): dado un argumento regresa el mismo argumento.=> (let [x 5 y \5 z "5" xs [4 5 6] ys #{\a \b \c} zs {:a 10 :b 20 :c 30}] [(identity x) (identity y) (identity z) (map identity xs) (map identity ys) (map identity zs)]) [5 \5 "5" (4 5 6) (\a \b \c) ([:a 10] [:b 20] [:c 30])]
constantly
: dado un argumento regresa una función de aridad variable la cual al ser aplicada regresa siempre el argumento dado aconstantly
.comp
(Función compuesta): dada cierta cantidad de funciones como argumentos (izq. a der.) regresa una función que al ser aplicada lleva a cabo la aplicación de las funciones dadas acomp
(der. a izq.). La función regresada es de aridad variable.=> (let [a (fn [x] (* 2 x)) b (fn [x] (max 0 x))] [[((comp a b) 5) ((comp a b) -5)] [((comp b a) 5) ((comp b a) -5)]]) [[10 0] [10 0]] => (let [a (fn [xs] (filter even? xs)) b (fn [xs] (filter (fn [x] (and (>= x 10) (<= x 50))) xs)) c (fn [xs] (filter (fn [x] (== 0 (rem x 3))) xs))] [((comp a b c) (range -100 101)) ((comp b c a) (range -100 101)) ((comp c b a) (range -100 101))]) [(12 18 24 30 36 42 48) (12 18 24 30 36 42 48) (12 18 24 30 36 42 48)]
complement
partial
juxt
memoize
fnil
every-pred
some-fn
some-fn
apply
->
->>
trampoline
as->
cond->
cond->>
some->
some->>
fn?
: ¿es una función?