Лисп Обратный "все" Функция - PullRequest
2 голосов
/ 07 декабря 2010

Я хочу написать в lisp функцию, которая переворачивает все элементы из списка, используя функции карты, но я не имею ни малейшего представления, как начать это .. Я думаю, что мне нужно каким-то образом использовать встроенную функцию reverse .. ДляНапример, если бы у меня был список (1 2 3 (4 5 6 (7 8 9)))) я бы получил (((9 8 7) 6 5 4) 3 2 1) или если бы у меня был список (1 2 3 (4 5) (6 7)) Я бы получил ((7 6) (5 4) 3 2 1) .. Любая помощь приветствуется!

Ответы [ 3 ]

4 голосов
/ 07 декабря 2010

Просто быстрый ответ, не уверен в эффективности / элегантности:

(defun reverse-deeply (list)
   (mapcar #'(lambda (li) 
               (cond
                ((consp li) (reverse-deeply li))
                (t li)))
           (reverse list)))
0 голосов
/ 07 декабря 2010
(defun reverse-list (list)
  (let ((result nil))
    (dolist (e list result)
      (push e result))))
0 голосов
/ 07 декабря 2010

Вот версия, которая работает для меня в Common-Lisp.

(defun reverse-list (list)
    (if (atom list)
        list ;; Not actually a list, return the atom
      (reverse (mapcar #'reverse-list list)))

;; Testing it out
(reverse-list '((1 2 3) (4 5 (3 6))))

Вывод:

(((6 3) 5 4) (3 2 1))

Mapcar - это функция, которая принимает другую функцию в качестве первого параметра исписок в качестве второго параметра.Затем он вызывает эту функцию для каждого элемента списка.Возвращает список всех ответов.Поэтому после того, как я использую «mapcar», чтобы перевернуть все подсписки, я снова вызываю «реверс», чтобы перевернуть больший список.

Функция, которую он вызывает в каждом подсписке, называется «обратный список».Это проверяет, является ли список атомом.Если это так, то это возвращает себя.Если это список, то он вызывает mapcar снова для каждого элемента в списке, а затем инвертирует результат.

...