Advertisement
Guest User

Untitled

a guest
May 29th, 2015
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.87 KB | None | 0 0
  1. => def - Definición de un macro
  2. Ejemplo:
  3. (def nomSimbolo "Texto")
  4.  
  5. => ns - Definición de una namespace
  6. Ejemplo:
  7. (ns namespace1)
  8. Variantes:
  9. :use - Importa al namespace otro namespace
  10. Ejemplo:
  11. (ns namespace1 (:use namespace0))
  12.  
  13. :require - Asegura que el namespace exista
  14. Ejemplo:
  15. (ns namespace1 (:require namespace0 namespace2))
  16. (ns namespace1 (:require [namespace0 :as ns0])) ;Alias ns0
  17.  
  18. => fn - Genera funcion
  19. Ejemplo:
  20. ((fn [a b] (* a b)) 2 10) ;Rsultado: 20
  21. (#(* %1 %2) 2 10) ;Rsultado: 20
  22.  
  23. => defn - Genera una funcion (o multiples según se defina), le asigna documentacion y un simbolo
  24. Nota:
  25. + El operador & antes del último argumento indica argumentos variables (seq)
  26. Ejemplo:
  27. (defn multiplicador ;Alias
  28. "Permite multiplicar un par de numeros" ;Doc
  29. [a b] ;Parametros
  30. (* a b)) ;Funcion
  31.  
  32. (defn funcion-polimorfica
  33. "Permite ejecutar diferentes funciones dependiendo de los argumentos"
  34. ([] 0)
  35. ([x] (* x x))
  36. ([x y] (* x y)))
  37.  
  38. => doc - Obtiene documentacion
  39. Ejemplo:
  40. (doc multiplicador)
  41.  
  42. => if - Condicional
  43. Ejemplo:
  44. (if (= 1 2) "then" "else")
  45.  
  46. => if-not - Condicional if negada
  47.  
  48. => cond - Equivalente a case
  49. Ejemplo:
  50. (defn calcula-aprobacion
  51. "Permite calcular aprobacion segun calificacion"
  52. [calificacion]
  53. (cond
  54. (< calificacion 50) "Expulsion"
  55. (< calificacion 70) "Reprobado"
  56. :else "Aprobado"
  57. )
  58. )
  59.  
  60. => let - Asigna un nombre al resultado de una operación
  61. Ejemplo:
  62. (let [a 2 b 3] (+ a b))
  63. (defn seconds-to-hours
  64. "Segundos a horas"
  65. [segundos]
  66. (let
  67. [
  68. minutos (/ segundos 60)
  69. horas (/ minutos 60)]
  70. horas))
  71.  
  72. => recur - Invoca la función recursivamente, haciendo uso de la teoría Tail Recursion
  73.  
  74. => loop - Permite inicializar los valores de la función recursiva desde su definición, apoyada de recur para generar la llamada correspondiente
  75. Ejemplo:
  76. (defn loop-sqrt
  77. "Raiz cuadrada usando loop y recur"
  78. [number]
  79. (loop [guess 1.0] ;Parámetro valor predeterminado: [p1 0 p2 1 ...]
  80. (if (good-enough? number guess)
  81. guess
  82. (recur (avg guess (/ number guess))))))
  83.  
  84.  
  85. => do - Permite la ejecución de sentencias con "Efectos colaterales" (side effects), donde la última sentencia es quien regresa el valor de la llamada
  86. Ejemplo:
  87. (do
  88. (println "hello")
  89. (println "from")
  90. (println "side effects")
  91. 0)
  92. (defn funcion-side-effects
  93. "Documentacion"
  94. [parametros]
  95. (println "hello")
  96. (println "from")
  97. (println "side effects")
  98. (+ 2 3))
  99.  
  100. => list - Genera una lista con los parametros dados
  101. Ejemplo:
  102. (list (/ 2 3) (/ 3 2)) ;Rsultado: (2/3 3/2)
  103. '(1 2 3)
  104.  
  105. => partial - Genera una función parcial con parámetros predeterminados esperando a ser invocada con los parámetros adicionales
  106. Ejemplo:
  107. (def part-doble (partial * 2))
  108. (part-doble 3) ;Rsultado: 6
  109. (part-doble 3 4) ;Rsultado: 24
  110.  
  111. => comp - Genera pila de funciones que son ejecutadas
  112. Ejemplo:
  113. ((comp - *) 2 3) ;Resultado: -(2 * 3) = -6
  114.  
  115. => inc - Incrementa número en 1
  116.  
  117. => dec - Decrementa número en 1
  118.  
  119. => quot - Resultado entero de la división de dos números
  120.  
  121. => rem - Residuo de la división de dos números
  122.  
  123. => min, max - Mínimo y máximo de los n números
  124.  
  125. => zero? - Valida si el número es 0
  126.  
  127. => pos?, neg? - Valida si el número es un número positivo o negativo
  128.  
  129. => number? - Valida si el parámetro es un número
  130.  
  131. => str - Obtiene la representación y concatenación de los parámetros en String
  132.  
  133. => subs - Substring, mismo comportamiento a Java
  134. Ejemplo:
  135. (subs "hola" 2) ;Rsultado: la
  136. (subs "hola" 0 2 ) ;Rsultado: ho
  137.  
  138. => string? - Valida si el parámetro es String
  139.  
  140. => re-pattern - Obtiene un patrón de expresión regular
  141. Ejemplo:
  142. (re-pattern "[a-z]{2}")
  143. #"[a-z]{2}"
  144.  
  145. => re-matches - Valida el segundo parámetro cumple con la expresión regular del primer parámetro
  146.  
  147. => re-matcher - Obtiene Matcher para uso posterior (ver re-find)
  148.  
  149. => re-find - Usando un Matcher busca el patrón en la expresión
  150. Ejemplo:
  151. (re-find (re-matcher #" [a-z]* " "Este es un texto prueba"))
  152.  
  153. => re-groups - Usando un Matcher agrupa las diferentes ocurrencias del patrón
  154.  
  155. => re-seq - Usando un Matcher regresa un lista de elementos que cumplen con el patrón
  156. Ejemplo:
  157. (re-seq #" [a-z] " "test")
  158.  
  159. => char - Obtiene el caracter \X a partir del número dado
  160. Ejemplo:
  161. (char 65) ;Rsultado: \A
  162.  
  163. => keyword - Obtiene la llave a partir de los String dados
  164. Ejemplo:
  165. (keyword "keyword") ;Rsultado :keyword
  166. (keyword "namespace" "keyword") ;Rsultado :namespace/keyword
  167.  
  168. => keyword? - Valida si el parámetro es una keyword
  169.  
  170. => peek - Obtiene el primer elemento en una lista o el último de un vector
  171. Ejemplo:
  172. (peek '(1 2 3)) ;Rsultado: 1
  173. (peek [1 2 3]) ;Rsultado: 3
  174.  
  175. => pop - Si se invoca con una lista, se obtiene otra lista sin el primer elemento, en caso de que el parámetro sea un vector se obtiene otro vector sin el último elemento
  176. Ejemplo:
  177. (pop '(1 2 3)) ;Rsultado: (2 3)
  178. (pop [1 2 3]) ;Rsultado: [1 2]
  179.  
  180. => vector?, list?, map? - Valida si el parámetro es del tipo Vector, Lista o Mapa
  181.  
  182. => vector - Genera un vector con los parámetros dados
  183. Ejemplo:
  184. (vector 1 2 3) ;Rsultado: [1 2 3]
  185.  
  186. => vec - Genera a partir de una colección cualquiera un vector
  187. Ejemplo:
  188. (vec '(1 2 3)) ;Rsultado: [1 2 3]
  189.  
  190. => get - Obtiene un elemento en un índice especificado de una colección, nil si no se encuentra o el elemento predeterminado (si se define)
  191. Ejemplo:
  192. (get [1 2 3] 1) ;Rsultado: 2
  193. ([1 2 3] 1) ;Rsultado: 2
  194. ([1 2 3] 10 "Error") ;Rsultado: "Error"
  195. (get {:a 1 :b 2} :b) ;Rsultado: 2
  196. ({:a 1 :b 2} :b) ;Rsultado: 2
  197. (get {:a 1 :b 2} :c) ;Rsultado: nil
  198. (get {:a 1 :b 2} :c "Error") ;Rsultado: "Error"
  199.  
  200. => conj, merge - Concatena a una colección N elementos regresando una colección nueva del mismo tipo (vectores, mapas, sets) con los elementos agregados
  201. Ejemplo:
  202. (conj [1 2 3] 4) ;Rsultado: [1 2 3 4]
  203. (conj '(1 2 3) 4) ;Rsultado: (4 1 2 3) Notese que esta es una secuencia
  204. (conj (seq [1 2 3]) 4) ;Rsultado: [4 1 2 3] Comportamiento debido a secuencia
  205. (conj {:a 1 :b 2} {:c 3}) ;Rsultado: {:a 1 :b 2 :c 3}
  206. (conj {:a 1 :b 2} {:b 3}) ;Rsultado: {:a 1 :b 3}
  207.  
  208. => assoc - Si se usa como parámetro un vector, ésta substituye en la posición indicada por el segundo parámetro regresando un vector nuevo con el tercer parámetro, en caso de que el parámetro sea un mapa se asigna la llave-valor al mapa correspondiente
  209. Ejemplo:
  210. (assoc [1 2 3] 2 5) ;Rsultado: [1 2 5]
  211. (assoc {:a 1} :b 2) ;Rsultado: {:a 1 :b 2}
  212. (assoc {:a 1} :a 2) ;Rsultado: {:a 2}
  213.  
  214. => dissoc - De un mapa elimina la llave/llaves indicadas
  215. Ejemplo:
  216. (dissoc {:a 1 :b 2 :c 3} :b :c) ;Rsultado: {:a 1}
  217.  
  218. => subvec - Obtiene un nuevo vector con los elementos entre los índices especificados
  219. Ejemplo:
  220. (subvec [1 2 3 4 5] 2) ;Rsultado: [3 4 5]
  221. (subvec [1 2 3 4 5] 2, 4) ;Rsultado: [3 4]
  222.  
  223. => hash-map, sorted-map - Obtiene un mapa/diccionario que usa hashtable o un árbol binario según sea el caso
  224. Ejemplo:
  225. (hash-map :a 1, :b 2) ;Rsultado {:a 1 :b 2}
  226. (sorted-map :a 1, :b 2) ;Rsultado {:a 1 :b 2}
  227.  
  228. => defstruct - Genera un elemento tipo Estructura
  229. Ejemplo:
  230. (defstruct person :first-name :last-name)
  231.  
  232. => struct-map - Genera un mapa/diccionario basado en una estructura definida, permitiendo un rendimiento óptimo
  233. Ejemplo:
  234. (defstruct person :first-name :last-name)
  235. (def person1 (struct-map person :first-name "Luke" :last-name "VanderHeart"))
  236.  
  237. => accesor - Permite acceder a un elemento de un structure-map definido en una estructura
  238. Ejemplo:
  239. (def get-first-name (accesor person :first-name))
  240. (get-first-name person1) ;Rsultado identico a: (person1 :first-name)
  241.  
  242. => merge-with - Permite realizar la funcionalidad de merge pero resolviendo el conflicto según la función dada como parámetro
  243. Ejemplo:
  244. (merge-with +
  245. {:a 1 :b 2} {:c 3 :b 10}) ;Rsultado: {:a 1, :b 12, :c 3}
  246. (merge-with (fn [a b] a)
  247. {:a 1 :b 2} {:c 3 :b 10}) ;Rsultado: {:a 1, :b 2, :c 3}
  248.  
  249. => contains? - Valida si dentro de una colección se encuentra un elemento específico
  250. Ejemplo:
  251. (contains? {:a 1 :b 2} :a) ;Rsultado: true
  252.  
  253. => keys - De un mapa obtiene las llaves que contiene como una secuencia
  254.  
  255. => vals - De un mapa obtiene los valores que contiene como una secuencia
  256.  
  257. => hash-set, sorted-set - Obtiene un Set que usa hashtable o un árbol binario según sea el caso
  258. Ejemplo:
  259. #{:a :b :c} ;Rsultado: #{:a :b :c}
  260. (hash-set :a :b :c) ;Rsultado: #{:a :b :c}
  261. (sorted-set :a :b :c) ;Rsultado: #{:a :b :c}
  262.  
  263. => clojure.set/union - Concatena los Set dados como parámetros en un nuevo Set
  264. Ejemplo:
  265. (clojure.set/union #{:a} #{:a :c}) ;Rsultado: #{:a :c}
  266.  
  267. => clojure.set/intersection - Obtiene un Set que contiene los elementos que se interceptan de múltiples Sets
  268. Ejemplo:
  269. (clojure.set/intersection #{:a} #{:a :c}) ;Rsultado: #{:a}
  270.  
  271. => clojure.set/difference - Obtiene los elementos del primer conjunto que no existen en el segundo Set
  272. Ejemplo:
  273. (clojure.set/difference #{:a :b} #{:b :c}) ;Rsultado: #{:a}
  274.  
  275. => first - Obtiene el primer elemento de una colección, para ejemplo ver "empty?"
  276.  
  277. => second - Obtiene el segundo elemento de una colección
  278.  
  279. => nth - Obtiene el elemento en la posición deseada de una secuencia
  280. Ejemplo:
  281. (nth '(1 2 3) 1) ;Rsultado: 2
  282.  
  283. => last - Obtiene el último elemento de un conjunto
  284.  
  285. => rest - Obtiene el conjunto de entrada menos el primer elemento, para ejemplo ver "empty?"
  286.  
  287. => empty? - Valida si la colección tiene elementos
  288. Ejemplo:
  289. (defn imprime-elementos [coleccion]
  290. (if (not (empty? coleccion))
  291. (do
  292. (println (str "Elemento " (first coleccion)))
  293. (recur (rest coleccion)))))
  294.  
  295. => seq - Permite tratar a una colección como secuencia
  296. Ejemplo:
  297. (seq [1 2])
  298.  
  299. => rseq - A partir de un vector o sorted-map obtiene la secuencia en orden inverso
  300. Ejemplo:
  301. (rseq [1 2]) ;Rsultado: (2 1)
  302.  
  303. => cons - Permite construir una secuencia a partir de los parámetros dados
  304. Ejemplo:
  305. (cons 4 '(3 2 1)) ;Rsultado: (4 3 2 1)
  306. (cons 1 nil) ;Rsultado: (1)
  307. (defn make-int-seq [max] ;Rsultado: (make-int-seq 10) -> (1 2 3 4 5 6 7 8 9 10)
  308. (loop [acc nil n max]
  309. (if (zero? n)
  310. acc
  311. (recur (cons n acc) (dec n)))))
  312.  
  313. => take - Obtiene n elementos de una secuencia definida, para ejemplo ver "lazy-seq"
  314.  
  315. => lazy-seq - Obtiene una secuencia que es evaluada según se necesita (y el resultado en Caché)
  316. Ejemplo:
  317. (defn f-incremental [valor incremental]
  318. (lazy-seq
  319. (cons valor (f-incremental (+ valor incremental) incremental))))
  320. (take 10 (f-incremental 0 2)) ;Rsultado: (0 2 4 6 8 10 12 14 16 18)
  321. (nth (f-incremental 2 3) 1000000) ;Rsultado: 3000002
  322.  
  323. => iterate - Regresa el siguiente valor en una secuencia infinita con evaluación retardada (similar a yield)
  324. Ejemplo:
  325. (defn f-incremental-iterate [valor incremental]
  326. (iterate (fn [x] (+ x incremental)) valor))
  327. (take 10 (f-incremental-iterate 0 2)) ;Rsultado: (0 2 4 6 8 10 12 14 16 18)
  328. (take 10 (iterate inc 5)) ;Rsultado: (5 6 7 8 9 10 11 12 13 14)
  329.  
  330. => repeatedly - Obtiene una secuencia con evaluación retardada aplicando la función usada como parámetro
  331. Ejemplo:
  332. (take 10 (repeatedly (fn [] (rand-int 100))))
  333.  
  334. => repeat - Repite el primer parámetro n veces (o indifinicas si no se indica)
  335. Ejemplo:
  336. (take 10 (repeat "hola"))
  337. (repeat 5 "hola")
  338.  
  339. => range - Obtiene secuencias según los parámetros dados
  340. Ejemplo:
  341. (range 5) ;Rsultado: (0 1 2 3 4)
  342. (range 5 10) ;Rsultado: (5 6 7 8 9)
  343. (range 5 10 2) ;Rsultado: (5 7 9)
  344.  
  345. => distinct - De una colección o secuencia dada obtiene los elementos sin sus duplicados
  346. Ejemplo:
  347. (distinct [1 2 2 5 5 7 7 7 8 8 8]) ;Rsultado: (1 2 5 7 8)
  348.  
  349. => filter, remove - De una colección dada, regresa una secuencia retardada de elementos que cumplen con la función filtro o no la cumplan para remove
  350. Ejemplo:
  351. (def f-filtro (fn [x] (= (rem x 2) 0)))
  352. (filter
  353. f-filtro
  354. [1 2 3 4 5 6 7 8 9]) ;Rsultado: (2 4 6 8)
  355. (remove
  356. f-filtro
  357. [1 2 3 4 5 6 7 8 9]) ;Rsultado: (1 3 5 7 9)
  358.  
  359. => concat, lazy-cat - Concatena los elementos de múltiples secuencias obteniendo una secuencia como resultado
  360. Ejemplo:
  361. (concat '(1 2 3) '(4 5 6)) ;Rsultado: (1 2 3 4 5 6)
  362. (concat {:a 1 :b 2} {:c 3}) ;Rsultado: ([:a 1] [:b 2] [:c 3])
  363.  
  364. => mapcat - Aplica una función (que regresa una secuencia o conjunto) a un conjunto de elementos y concatena los resultados
  365. Ejemplo:
  366. (mapcat (fn [x] (repeat 3 x)) [1 2 3]) ;Rsultado: (1 1 1 2 2 2 3 3 3)
  367.  
  368. => cycle - Dado una secuencia de entrada se genera una secuencia retardada infinita
  369. Ejemplo:
  370. (take 10 (cycle '(1 2 3))) ;Rsultado: (1 2 3 1 2 3 1 2 3 1)
  371.  
  372. => interleave - De un conjunto de secuencias obtiene los elementos según su posición incremental en una secuencia retardada
  373. Ejemplo:
  374. (interleave [:a :b :c] (iterate inc 1)) ;Rsultado: (:a 1 :b 2 :c 3)
  375.  
  376. => interpose - Interpone un valor entre cada valor de una colección dada, regresando una secuencia retardada
  377. Ejemplo:
  378. (take 10 (interpose 0 (iterate inc 1))) ;Rsultado: (1 0 2 0 3 0 4 0 5 0)
  379.  
  380. => next - De una secuencia obtiene los elementos a partir del segundo
  381. Ejemplo:
  382. (next '(1 2 3)) ;Rsultado: (2 3)
  383.  
  384. => drop - De una secuencia y el número de elementos a descartar obtiene el restante
  385. Ejemplo:
  386. (drop 2 '(1 2 3 4 5)) ;Rsultado: (3 4 5)
  387.  
  388. => drop-while - De una secuencia elimina los elementos de izquierda a derecha mientras se cumpla la condición
  389. Ejemplo:
  390. (drop-while (fn [x] (= x \a)) "aaabac") ;Rsultado: (\b \a \c)
  391. (drop-while pos? [2 1 5 -3 6 -2 -1]) ;Rsultado: (-3 6 -2 -1)
  392.  
  393. => take-nth - De una secuencia obtiene un elemento cada N
  394. Ejemplo:
  395. (take-nth 3 [0 1 2 3 4 5 6 7 8 9]) ;Rsultado: (0 3 6 9)
  396.  
  397. => take-while - De una secuencia obtiene a los elementos de ésta mientras cumplan con la condición dada
  398. Ejemplo:
  399. (take-while pos? [2 3 4 -1 -2 0]) ;Rsultado: (2 3 4)
  400.  
  401. => drop-last - De una secuencia regresa otra secuencia menos N elementos indicados (default 1)
  402. Ejemplo:
  403. (drop-last '(1 2 3 4 5)) ;Rsultado: (1 2 3 4)
  404. (drop-last 2 '(1 2 3 4 5)) ;Rsultado: (1 2 3)
  405.  
  406. => reverse - De una secuencia obtiene otra con los elementos inversos
  407. Ejemplo:
  408. (reverse '( 1 2 3 )) ;Rsultado: (3 2 1)
  409.  
  410. => sort - Dada una secuencia se obtiene otra ordenada
  411. Ejemplo:
  412. (sort '(2 3 1)) ;Rsultado: (1 2 3)
  413.  
  414. => sort-by - Dada una secuencia y una función de comparación se obtiene una secuencia ordenada
  415. Ejemplo:
  416. (sort-by (fn [x] (/ 1 x)) [1 2 3 4 5]) ;Rsultado: (5 4 3 2 1)
  417.  
  418. => split-at - Se obtiene un vector con los conjuntos divididos en un índice dado
  419. Ejemplo:
  420. (split-at 2 [1 2 3 4 5 6]) ;Rsultado: [(1 2) (3 4 5 6)]
  421.  
  422. => split-with - De un conjunto se obtienen divide al no cumplir con una condición dada
  423. Ejemplo:
  424. (split-with (fn [x] (> 10 x)) [5 10 7 15]) ;Rsultado: [(5) (10 7 15)]
  425.  
  426. => partition - De un conjunto de elementos se divide en conjuntos y con un offset si se especifica
  427. Nota:
  428. + Ciclo infinito si offset es 0
  429. Ejemplo:
  430. (partition 2 [:a :b :c :d :e :f]) ;Rsultado: ((:a :b) (:c :d) (:e :f))
  431. (partition 2 3 [:a :b :c :d :e :f]) ;Rsultado: ((:a :b) (:d :e))
  432. (partition 2 3 [:a :b :c :d :e :f :g :h :i :j]) ;Rsultado: ((:a :b) (:d :e) (:g :h))
  433. (partition 3 [:a :b :c :d :e :f :g :h :i :j]) ;Rsultado: ((:a :b :c) (:d :e :f) (:g :h :i))
  434. (partition 3 3 [:a :b :c :d :e :f :g :h :i :j]) ;Rsultado: ((:a :b :c) (:d :e :f) (:g :h :i))
  435.  
  436. => map - Se aplica una función F a un conjunto dado haciendo uso de los elementos en esa posición de los conjuntos N como parámetros para F
  437. Ejemplo:
  438. (map pos? [2 1 5 -3 6 -2 -1]) ;Rsultado: (true true true false true false false)
  439. (map + [2 4 8] [1 3 5]) ;Rsultado: (3 7 13)
  440. (map + [2 4 8] [1 3 5] [10 10 10]) ;Rsultado: (13 17 23)
  441. (map
  442. (fn [a b c] (/ (+ a b) c))
  443. [2 4 8] [1 3 5] [10 20 30]) ;Rsultado: (3/10 7/20 13/30)
  444.  
  445. => apply - Ejecuta una función en el conjunto definido
  446. Ejemplo:
  447. (apply + [1 2 3]) ;Rsultado: 6
  448. (apply + 10 [1 2 3]) ;Rsultado: 16
  449. (apply str [\y " " \o]) ;Rsultado: "y o"
  450.  
  451. => reduce - Dada una secuencia de elementos se aplica consecutivamente una función entre cada uno de ellos, obteniendose al final un único elemento
  452. Ejemplo:
  453. (defn concat-str [x y] (apply str [x " " y]))
  454. (reduce concat-str "Luis") ;Rsultado: "L u i s"
  455. (reduce concat-str "I'm " "Luis") ;Rsultado: "I'm L u i s"
  456.  
  457. => some - Valida si una función al ser aplicada a cada elemento de un conjunto se obtiene verdadero
  458. Ejemplo:
  459. (some (fn [x] (> x 5)) [1 2 3 4 5]) ;Rsultado nil
  460. (some (fn [x] (> x 3)) [1 2 3 4 5]) ;Rsultado true
  461.  
  462. => every? - Valida si cada uno de los elementos de un conjunto cumplen con la condición expuesta en la función
  463. Ejemplo:
  464. (every? (fn [x] (> x 0)) [1 2 3 4 5]) ;Rsultado: true
  465. (every? (fn [x] (< x 4)) [1 2 3 4 5]) ;Rsultado: false
  466.  
  467. => dorun - Ejecuta código con efectos secundarios que se encuentra de una ejecucición retardada
  468. Ejemplo:
  469. (def funcionalidad
  470. (map println (range 1 10)))
  471. (dorun funcionalidad) ;Rsultado: ... Impresión de elementos 1 a 9
  472. (dorun 2 funcionalidad) ;Rsultado: ... Impresión de elementos 1 a 3
  473.  
  474. => doall - Ejecuta la función retardada obteniendose como resultado los elementos ejecutados, con probabilidad de en ciclos infinitos generar OutOfMemory
  475.  
  476. => ref - Establece una referencia a una variable que cambia de manera síncrona y transaccional
  477.  
  478. => deref - Obtiene el valor al que apuntala la referencia
  479. Ejemplo:
  480. (def my-ref (ref 5))
  481. (deref my-ref) ;Rsultado 5
  482. @my-ref ;Rsultado 5
  483.  
  484. => ref-set - Establece un nuevo valor a una referencia dada, es indispensable que se encuentre en una transacción
  485.  
  486. => dosync - Genera una transacción y cambia el valor de las referencias contenidas dentro de esta
  487. Ejemplo:
  488. (def my-ref1 (ref 5))
  489. (def my-ref2 (ref 2))
  490. (dosync
  491. (ref-set my-ref1 10)
  492. (ref-set my-ref2 15))
  493.  
  494. => alter, commute - Permite modificar el valor de una referencia haciendo uso de una función y N parámetros de la función
  495. Nota:
  496. + Hacer uso de commute en caso de que el orden de las modificaciones no afecte el resultado
  497. Ejemplo:
  498. (def my-ref1 (ref 5))
  499. (def my-ref2 (ref 10))
  500. (dosync
  501. (alter my-ref1 + 10) ;Rsultado 15
  502. (alter my-ref2 (fn [x y z] (* (+ x z) y)) 10 2)) ;Rsultado 120
  503.  
  504. => doseq - Permite iterar sobre una secuencia para la ejecución de código con efectos colaterales
  505. Ejemplo:
  506. (def my-contacts (ref []))
  507. (defn add-contact [contacts contact]
  508. (dosync
  509. (alter contacts conj (ref contact))))
  510. (defn print-contacs [contacts]
  511. (doseq [c @contacts]
  512. (println (str (@c :fname) " " (@c :lname)))))
  513. (add-contact my-contacts {:fname "x1" :lname "y1"})
  514. (add-contact my-contacts {:fname "x2" :lname "y2"})
  515. (print-contacs my-contacts)
  516.  
  517. => atom - Permite obtener una referencia síncrona y no transaccional
  518.  
  519. => swap! - Cambia una referencia de tipo atom haciendo uso de una función de cambio y parámetros de la misma función (similar a alter para ref)
  520. Ejemplo:
  521. (def my-atom (atom 5))
  522. (swap! my-atom + 3) ;Resultado: 8
  523.  
  524. => reset! - Cambia una referencia de tipo atom a un valor definido
  525. Ejemplo:
  526. (def my-atom (atom 5))
  527. (reset! my-atom 8) ;Resultado: 8
  528.  
  529. => agent - Genera una referencia asíncrona
  530.  
  531. => send, send-off - Solicita un cambio al valor que apuntala la referencia agent, aunque asíncronamente
  532. Nota:
  533. + Usar send para funciones de uso intensivo del CPU y send-off para procesos de tiempo prolongado
  534. Ejemplo:
  535. (def my-agent (agent 5))
  536. (send my-agent + 3) ;Resultado asíncrono: 8
  537.  
  538. => set-error-mode! - Permite establecer el comportamiento a tomar si se genera una excepción en la función a evaluar para cambiar un agente
  539. Nota:
  540. + Posibles valores: ":continue" ":fail"
  541.  
  542. => set-error-handler! - Permite establecer una función a llamar si existe una excepción en la función de modificación de un Agente
  543. Nota:
  544. + Sólo se ejecutará si error-mode es :fail
  545. Ejemplo:
  546. (def my-agent (agent 5))
  547. (set-error-handler! my-agent (fn [agt ex] ( ... )))
  548. (send funcion-excepcion)
  549.  
  550. => error-handler - Permite obtener la función de control en caso de excepción para un agente
  551.  
  552. => agent-error - Permite obtener la excepción generada al actualizar un agente
  553. Ejemplo:
  554. (agent-error my-agent)
  555.  
  556. => restart-agent - Permite indicar al agente que puede continuar cambiando sus valores
  557. Ejemplo:
  558. (restart-agent my-agent
  559. 5 ;Nuevo valor
  560. :clear-actions true) ;Limpiar pila de funciones para actualizar
  561.  
  562. => await, await-for - Permite esperar a N agentes que terminen de efectuar los cambios de sus valores
  563. Nota:
  564. + await-for indica un tiempo límite de espera, si no terminan regresa nil
  565.  
  566. => shutdown-agents - Bloquea de manera definitiva las llamadas a send y send-off para los agentes del sistema y finaliza los hilos al terminar de efectuar los cambios
  567.  
  568. => binding - Permite ejecutar funciones con valores de símbolos previamente establecidas pero con valores diferentes
  569. Ejemplo:
  570. (def x 1)
  571. (def y 1)
  572. (+ x y) ;Resultado 2
  573. (binding [x 2 y 3] (+ x y)) ;Resultado 5
  574. (+ x y) ;Resultado 2
  575.  
  576. => set-validator! - Permite establecer a las referencias una función de validación antes de cambiar el valor al que apuntala la referencia (agent, atom, var)
  577. (def my-ref (ref 5))
  578. (set-validator! my-ref (fn [x] (> x 10)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement