Responda conforme a questão:
Escreva códigos em Lisp para executar as seguintes tarefas:
Adicionar um elemento a uma lista (6 escores)
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))
“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)))
“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))))
“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))))
“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))))