Есть рекурсивный способ:
(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²) это запретная зона для программистов. Такие ситуации стараются избегать. Зацикленный список это посути граф (мат.). У графов нет понятия обращение.