Модификация списка схем - PullRequest
       4

Модификация списка схем

0 голосов
/ 19 сентября 2010

Я пытаюсь написать функцию схемы, которая принимает список в форме:

((#f ((1 1) (2 1)))
 (#f ((1 3) (5 1)))
 (#f ((1 4) (7 1)))
)

и удаляет все #f, чтобы получить список вроде:

( ((1 1) (2 1))
  ((1 3) (5 1))
  ((1 4) (7 1))
)

Я попробовал следующий код, но не могу заставить его работать:

(define meth
  (lambda lst
    (if (equal? (cdr lst) '())
      (cdr (car lst))
      (cons (list-ref (car lst) 1) (meth (cdr lst))))))

Кто-нибудь знает, как это сделать? Благодаря.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2010

Вот способ сделать это более близко к тому, что у вас было:

(define meth
  (lambda (lst)
    (cond
      ((null? lst) '())
      ((cons (cadr (car lst)) (meth (cdr lst))))
      )
    )
  )


(define a '(
            (#f ((1 1) (2 1)))
            (#f ((1 3) (5 1)))
            (#f ((1 4) (7 1)))
            ))
2 голосов
/ 19 сентября 2010

Вы можете просто использовать map, чтобы применить функцию cdr к каждому подсписку в списке, например: (map cdr lst).Однако это даст вам

( (((1 1) (2 1)))
  (((1 3) (5 1)))
  (((1 4) (7 1)))
)

для входного сэмпла, что на один уровень больше вложенности, чем выходной сэмпл.Таким образом, чтобы получить пример выходных данных, используйте list-ref, чтобы получить второй элемент каждого подсписка:

(define (meth lst) (map (lambda (x) (list-ref x 1)) lst))

Редактировать: Как подсказал Эли Барзилай, есть функция cadr для получения второго элементасписка, так что это может быть сокращено до:

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