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 println como ú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