Seguinte: Macros Acima: Parâmetros Especiais Anterior: Parâmetros de Resto
Índice remissivo

Parâmetros de Chave

O qualificador &key informa o avaliador que os parâmetros qualificados são ligados através de uma indicação explícita de quem chama a função. Essa indicação é feita designando o nome de cada parâmetro precedido por dois pontos e indicando qual o valor a que ele deve estar ligado. Os parâmetros que não forem ligados comportam-se como se fossem opcionais. Este género de parâmetros dizem-se de chave (keyword).

Desta forma, o &key permite trocar a ordem dos argumentos. O seguinte exemplo mostra o funcionamento do &key.

> ((lambda (x y &key z (w 4) k) (lista x y z w k)) 
   1 2 :k 5 :z 3)
(1 2 3 4 5)

A grande maioria das funções pré-definidas na linguagem para manipular listas possui parâmetros opcionais e de chave. Repare-se que as chaves são tratadas de forma especial pelo avaliador. Efectivamente, se assim não fosse, quando especificávamos os argumentos de uma função com parâmetros de chave, o avaliador iria tentar determinar o valor das chaves, gerando então um erro por estas não terem valor. Na realidade, quando um símbolo qualquer é precedido por dois pontos, esse símbolo é considerado como especial, pertencendo ao conjunto dos símbolos chaves, e avaliando para si próprio.

> ola
Error: Unbound variable: OLA
> 'ola
OLA
> :ola
:OLA

Os tipos aglomerados constituem uma das grandes utilizações dos parâmetros de chave. Nestes tipos de dados, os constructores limitam-se a realizar um agrupamento de valores para os diversos constituintes do tipo. Vimos o exemplo de um automóvel, que era constituido por uma marca, um modelo, um número de portas, etc. Embora não exista qualquer razão para que a marca de um automóvel seja mais importante que o seu número de portas, infelizmente a ordenação implícita dos argumentos das funções Lisp impõem que assim seja. Podemos resolver este problema usando parâmetros de chave, de forma a eliminar a ordenação dos argumentos e permitir ao utilizador especificá-los pela ordem que entender, por exemplo:

(defun novo-automovel (&key marca modelo portas)
  (list marca modelo portas))

> (novo-automovel :portas 2 :marca 'honda :modelo 'civic) (honda civic 2)

Para além da possibilidade de alteração da ordem dos argumentos, o qualificador &key ajuda à legibilidade do programa, ao tornar explícito o papel que cada argumento tem na função.


Seguinte: Macros Acima: Parâmetros Especiais Anterior: Parâmetros de Resto
Índice remissivo

Copyright António Leitão, 1995