Resposta ao exercício 58

Para resolver o problema, basta atingir a última célula cons da primeira lista (usando uma função local fim) e ligar destrutivamente o seu cdr (que é nil) à segunda lista.

(defun junta! (lista1 lista2)
  (labels ((fim (lista)
             (if (null (rest lista))
               lista
               (fim (rest lista)))))
    (if (null lista1)
      lista2
      (progn
        (rplacd (fim lista1) lista2)
        lista1))))

Esta função já existe em Lisp e denomina-se nconc.