Обращение списка

  Есть рекурсивный способ:

(nil  defmethod rev (result)  result)
('cons  defmethod rev (result)
  ((this  rest) rev (nil  cons  (this first)  result)))

  В таких простых задачах невыгодно использовать рекурсию, так как результатом будет чрезмерное использование памяти стека для возврата из функций. Используем переменную.

(nil  defmethod rev ()
  (nil  let (result (i  this))
    (nil  while (nil  consp i)
      (nil  setq  result  (nil  cons  (i  first)  result) i (i  rest)))
    result))

  Списки могут быть не линейными а зацикленными. В таких условиях программа чтобы не зациклится должна контролировать возможность циклов. Сложность алгоритма станет O(n²). Результатом будет список без цикла.

(nil  defmethod rev ()
  (nil  let ((i this) (next (this rest))  result  (flagcycled false))
    (nil  while (nil  and (nil  consp i)  (nil  not flagcycled))
      (nil  setq  result  (nil  cons  (i  first)  result))
      (nil  if  (next find  this  i)
        (nil  setq  flagcycled  true)
        (nil  setq  i next  next  (next rest))))
    result))
(nil  defmethod find  (first  last)
  (nil  let ((flagfound false))
    (nil  while (nil  and (nil  not (nil  eq  first last))  (nil  not flagfound))
      (nil  if  (nil  eq  this  first)
        (nil  setq  flagfound true)
        (nil  setq  first (first  rest))))
    (nil  if  (nil  not flagfound)
      (nil  if  (nil  eq  this  first)
        (nil  setq  flagfound true)))
    flagfound))

  Использование алгоритмов сложностью O(n²) это запретная зона для программистов. Такие ситуации стараются избегать. Зацикленный список это посути граф (мат.). У графов нет понятия обращение.