https://kimh.github.io/clojure-by-example/#about-this-page
resolve alguns “problemas” em lisp
usa toda a infraestrutura de Java: maquina virtual e bibliotecas e provavelmente o compilador (para bytecode - JVM)
contem algumas coisas importantes do lisp, p. ex: macros
(funcao-ou-comando arg1 arg2 ...)
mas nem toda lista ( ... )
é uma expressão que deve ser avaliada.
o Closure substitui essas listas que nao devem ser avaliadas por [... ]
(defun hello-world (nome sobrenome)
(print (concatenate 'string "Hello" nome " " sobrenome))
)
(nome sobrenome)
nao é uma lista que vai ser avaliada, é uma que contem os parametros da função
Closure:
(defn hello-world [nome sobrenome]
(println (str "Hello " nome " " sobrenome)
)
Lisp
(let ((x 10)
(y 20))
(+ x y))
Closure
(let [x 10 y 20]
(+ x y))
Lisp
(map inc '(1 2 3))
Closure
(map inc [1 2 3])
sequencias (o super tipo de listas, vetores, etc são lazy
(map inc [1 2 3 4 5 6 7])
retorna um thunk que devolve um elemento por vez
map, reduce, filter
, etc
tem o equivalente do go
de goland
future
variavies que trocam de valor em closure sao chamadas de atomos e po site diz que sao thread safe (que é a grande coisa de RUST).
recursão nao é boa em Java (que nao esta esperando crescer a pinha de chamada indefinidamente)
closure permite recursão tradicional mas pode dar problema
ha também o comando recur
que é usado quando a recursao é a ultima coisa a ser feita - e portanto permite otimizacao de ultima chamada.