Como referimos anteriormente, a forma especial return, que se pode utilizar dentro de um loop, possui um parâmetro opcional, que é o valor a retornar do ciclo. Isto quer dizer que o argumento que deveremos passar para esse parâmetro pode ser omitido. Esta característica é também muito útil para a definição de funções, permitindo que ela possa assumir certos parâmetros por omissão.
Para definirmos funções que têm parâmetros opcionais temos de usar um qualificador especial designado &optional na lista de parâmetros formais. Esse qualificador indica que todos os parâmetros que se lhe seguem são opcionais e que, se os argumentos correspondentes forem omitidos, eles valem nil. Se pretendermos um valor diferente para um parâmetro, podemos inserir o parâmetro numa lista com o seu valor. A seguinte função mostra como se pode definir a função incr que incrementa o seu argumento de uma unidade, ou de uma quantidade que lhe seja fornecida.
(defun incr (x &optional (i 1)) (+ x i))> (incr 10) 11 > (incr 10 5) 15
Exercício 65
Defina a função eleva, que eleva um número a uma determinada potência. Se a potência não for indicada deverá ser considerada 2. Nota: a expressão (expt x y) determina a potência y de x, i.e.,.
Os parâmetros opcionais permitem ainda simplificar a escrita de processos iterativos, ao aumentarem o número de variáveis de estado sem obrigar o utilizador a inicializá-las. No entanto, é usual considerar-se esta utilização como mau estilo de programação.
Exercício 66
Reescreva a função factorial de forma a gerar um processo iterativo mas sem usar funções auxiliares.