Ao invés de atualizar variáveis em memória, os programas usam composição de funções.
O Benefício da imutabilidade é saber mais facilmente o que está acontecendo no programa, já que cada valor que o programa referencia é sempre o mesmo de quando ele foi originalmente criado. Também torna mais fácil adicionar concorrência já que há bem menos necessidade de gerenciar atualizações simultâneas, e bem menos necessidade de usar travas (locks) nos valores. De fato, um dos principais objetivos do design do Clojure é a facilitação de programação concorrente com o mínimo de locks.
- Ruby
def oo_func(str) str.upcase! puts str end
- Clojure
(def fp-func(str) (let [str2 (upper-case str)] (print str2)))
Funções deveriam ser o mais “puras” possível. O que significa:
- não deveriam mudar o estado atual do sistema, como ter variáveis globais e funções que mudam os seus valores.
- sempre retornam o mesmo resultado independente do contexto. Com as mesmas entradas a função sempre deveria retornar a mesma saída.
def MyClass attr_writer :a def initialize(x) a = x end def double a = a*2 end end
(ns my.namespace) (defn double[x] (* x 2))
Funções numa linguagem funcional são tratadas como qualquer outro elemento da linguagem (números, strings, etc), ou seja, podem ser guardadas numa variável, passadas para outras funções, retornadas por outras funções, ou ainda serem criadas em tempo de execução. Neste caso dizemos que as funções são cidadãs de primeira classe na linguagem.
Voltar ao primeiro slide, ou ir para o índice do currículo.