开发者

Scheme list modification

I am trying to write a scheme function that takes a list of the form:

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

and removes all the #f to give a list li开发者_高级运维ke:

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

I have tried the following code but cannot get it to work:

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

Does anyone know how to do this? Thanks.


You can just use map to apply the cdr function to each sublist in the list, like this: (map cdr lst). However this will give you

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

for your sample input, which is one level of nesting more than your sample output. So to get your sample output, use list-ref to get the second element of each sublist:

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

Edit: As Eli Barzilay helpfully pointed out, there is the cadr function to get the second element of a list, so this can be shortened to:

(define (meth lst) (map cadr lst))


Here is a way to do it more closely to what you had:

(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)))
            ))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜