Схема - автомобиль / CDR на пустой список - PullRequest
3 голосов
/ 01 декабря 2011

Я написал большую программу, которая использует car и cdr, и делаю:

(map car (append (map caddr lists) (map cadr lists))

Когда lists - это список списков в следующем формате ((a (b) (c)) (d (e) (f))...(x (y) (z))) Когда я сделал это, я получил один список (b c e f... y z) (Примечание: b, c, ... y, z - список чисел; a, d ... x - символ)

Но теперь я обнаружил, что b, c, ..., y, z также могут быть пустым списком, и это дает следующую ошибку:

car: expects argument of type <pair>; given ()

Что я могу сделать?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вот мой выстрел. Это прямое решение, без использования map, filter; таким образом, я избегаю перебирать элементы списка, создавая промежуточные списки - за исключением того, что я использовал операцию reverse для сохранения исходного порядка элементов, если это не проблема, удалите reverse. Для каждого элемента в исходном списке, если часть (b) ... или (c) ... пуста, она пропускается.

(define (process lists)
  (let loop ((l (reverse lists))
             (a '())
             (b '()))
    (cond ((null? l)
           (append b a))
          ((or (not (pair? (cadar l))) (not (pair? (caddar l))))
           (loop (cdr l) a b))
          (else
           (loop (cdr l) (cons (caadar l) a) (cons (car (caddar l)) b))))))
1 голос
/ 01 декабря 2011

Вы пробовали отфильтровывать пустые списки до вашего map?Примерно так:

(map car (filter pair? (append (map caddr lists) (map cadr lists))))

Принципиальная проблема заключается в том, что () не является парой, а car действует только на пары.Самое простое решение - просто избавиться от всего, что не является парой, перед отображением car в списке;это то, что делает (filter pair? ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...