Responda conforme a questão:
Escreva códigos em Lisp para executar as seguintes tarefas:
Adicionar um elemento a uma lista (6 escores)

Passo 1

O enunciado pede para escrever código em Lisp que adicione um elemento a uma lista. O conteúdo de Lisp que vamos usar envolve operações fundamentais de lista, em especial as funções cons, append e manipulação de subsequências com subseq. A partir daí, podemos criar funções que inserem um elemento no início, no fim ou em uma posição arbitrária da lista.

Passo 2

Para adicionar um elemento no início de uma lista, usamos a função cons, que monta uma nova lista cujo primeiro elemento é o valor dado, seguido pelos elementos da lista original. Exemplo:
(defun add-element-front (elem lst)
 "Retorna uma nova lista com ELEM adicionado no início de LST."
 (cons elem lst))
Chamada de exemplo:
(add-element-front 10 '(\(123\))) ; => (\(10123\))

Passo 3

Para adicionar um elemento no fim da lista de forma não destrutiva, podemos usar append junto com list para transformar o elemento em uma lista de um único item:
(defun add-element-end (elem lst)
 "Retorna uma nova lista com ELEM adicionado ao final de LST."
 (append lst (list elem)))
Chamada de exemplo:
(add-element-end 10 '(\(123\))) ; => (\(12310\))

Passo 4

Se quisermos adicionar o elemento em uma posição arbitrária (por índice), dividimos a lista original em duas partes com subseq e depois reconstruímos com append:
(defun add-element-at (elem lst idx)
 "Insere ELEM em LST na posição IDX (0-based). Lança erro se IDX estiver fora de faixa."
 (let ((n (length lst)))
 (when (or (< idx 0) (> idx n))
 (error "Índice ~S fora de faixa para lista de tamanho ~S" idx n))
 (append (subseq lst 0 idx)
 (list elem)
 (subseq lst idx))))
Chamadas de exemplo:
(add-element-at 10 '(\(123\)) 0) ; => (\(10123\))
(add-element-at 10 '(\(123\)) 2) ; => (\(12103\))
(add-element-at 10 '(\(123\)) 3) ; => (\(12310\))

Passo 5

Para quem quiser uma única função genérica que escolha a posição com uma keyword, usamos &key e case:
(defun add-element (elem lst &key (position :front) (index 0))
 "Adiciona ELEM a LST. POSITION é :front, :end ou :at. IDX só vale se POSITION for :at."
 (case position
 (:front (cons elem lst))
 (:end (append lst (list elem)))
 (:at (add-element-at elem lst index))
 (otherwise
 (error "POSITION inválido: ~S" position))))
Exemplos:
(add-element 10 '(\(123\)) :position :front) ; => (\(10123\))
(add-element 10 '(\(123\)) :position :end) ; => (\(12310\))
(add-element 10 '(\(123\)) :position :at :index 1) ; => (\(11023\))

Resposta

(defun add-element-front (elem lst)
“Retorna uma nova lista com ELEM adicionado no início de LST.”
(cons elem lst))
(defun add-element-end (elem lst)
“Retorna uma nova lista com ELEM adicionado ao final de LST.”
(append lst (list elem)))
(defun add-element-at (elem lst idx)
“Insere ELEM em LST na posição IDX (0-based). Lança erro se IDX estiver fora de faixa.”
(let ((n (length lst)))
(when (or (< idx 0) (> idx n))
(error “Índice ~S fora de faixa para lista de tamanho ~S” idx n))
(append (subseq lst 0 idx)
(list elem)
(subseq lst idx))))
(defun add-element (elem lst &key (position :front) (index 0))
“Adiciona ELEM a LST. POSITION é :front, :end ou :at. IDX só vale se POSITION for :at.”
(case position
(:front (cons elem lst))
(:end (append lst (list elem)))
(:at (add-element-at elem lst index))
(otherwise
(error “POSITION inválido: ~S” position))))

Exercícios relacionados