Seguinte: Modelo de Ambientes Acima: Programação Imperativa Anterior: Alteração de Dados
Índice remissivo

Repetição

Para além dos operadores de atribuição (setq, rplaca, rplacd, etc.) e de sequenciação (progn, prog1, etc.) a linguagem Common Lisp possui muitas outras formas especiais destinadas a permitir o estilo de programação imperativa. De destacar são as estruturas de controle de repetição, tais como o loop, o do, o dotimes e ainda outras adequadas para iterar ao longo de listas.

O loop é a mais genérica de todas as formas de repetição. Ela recebe um conjunto de expressões que avalia sequencialmente, repetindo essa avaliação em ciclo até que seja avaliada a forma especial return. Esta última recebe uma expressão opcional e termina o ciclo em que está inserida, fazendo-o devolver o valor daquela expressão.

A seguinte expressão exemplifica um ciclo que escreve todos os números desde 0 até 100, retornando o símbolo fim no final do ciclo.

(let ((n 0))
  (loop
    (print n)
    (setq n (1+ n))
    (when (> n 100)
      (return 'fim))))

A forma especial do é um pouco mais sofisticada que o loop. Ela permite estabelecer variáveis, inicializá-las e incrementá-las automaticamente, testar condições de paragem com indicação do valor a retornar e repetir a execução de código. Se reescrevermos o exemplo anterior usando a forma especial do, obtemos:

(do ((n 0 (1+ n)))
    ((> n 100) 'fim)
  (print n))

Tal como o loop, a forma especial do pode ser interrompida em qualquer altura com um return, retornando o valor opcional fornecido com o return.

Apesar do estilo mais utilizado na maioria das linguagens de programação ser o imperativo, ele é muito pouco natural em Lisp.

A falta de naturalidade resulta, por um lado, de os programas em Lisp se decomporem geralmente em pequenas funções que calculam valores, invalidando uma abordagem baseada em ciclos de alteração de variáveis, típica da programação imperativa.

Por outro lado, a grande maioria de tipos de dados existentes em Lisp são inerentemente recursivos, o que dificulta o seu tratamento segundo o estilo imperativo.

Apesar de muito pouco práctico para usar em Lisp, a programação imperativa tem algumas vantagens, das quais a possibilidade de atribuição é a maior (e também a mais perigosa).


Seguinte: Modelo de Ambientes Acima: Programação Imperativa Anterior: Alteração de Dados
Índice remissivo

Copyright António Leitão, 1995