Funções Multi-arity
Funções Multi-arity são funções definidas para aceitar diferentes números de parâmetros (aridades).
Em Clojure, todas as variações de aridade devem ser declaradas dentro de um único comando defn.
O uso de múltiplos comandos defn (como uma sobrecarga de métodos no Java) para o mesmo símbolo não adiciona novas aridades, mas sim substitui a definição anterior por completo.
Essa técnica permite que uma mesma função se comporte de formas distintas dependendo da quantidade de argumentos fornecidos na invocação de funções.
Estrutura de Aridades Múltiplas
A sintaxe para definir aridades múltiplas exige que cada versão da função seja encapsulada em uma lista própria contendo seu vetor de parâmetros e seu corpo.
A estrutura segue o formato
([param-a*] corpo-a) ([param-b*] corpo-b)O corpo de cada aridade pode conter múltiplas expressões, mas o valor de retorno será sempre o resultado da última expressão avaliada.
(defn calcular-preco
([valor]
(println "Iniciando cálculo com taxa padrão de 10%.")
(+ valor (* valor 0.10)))
([valor taxa]
(println "Iniciando cálculo com taxa personalizada.")
(str "Processando...")
(+ valor taxa)))NOTE
É comum que uma aridade invoque outra para evitar redundância (como mostra o exemplo abaixo), técnica utilizada frequentemente para definir valores padrão para argumentos ausentes.
Exemplo de implementação:
(defn messenger
([] (messenger "Hello world!"))
([msg] (println msg)))
Comportamento de Retorno em Funções
O valor de retorno em funções, incluindo as de aridade múltipla, é determinado pela avaliação da expressão final do corpo executado.
-
Se o corpo da função for composto por expressões, o valor de retorno será uma expressão.
-
No caso de funções que utilizam
printlncomo última instrução, o retorno seránil, pois o efeito da função é a impressão no console e não a produção de um dado de saída.
Referências
https://clojure.org/guides/learn/functions#_multi_arity_functions