如何遍历方案球拍中的对列表

How to loop through a list of pairs in scheme racket

所以我有这个对,我想遍历所有对并取其数字和符号进行比较。我需要检查数字是否在 (1-7) 之间或者它是 J Q K。符号需要始终为 H S D C,所以我需要检查它。 我知道如何使用 cons staments 进行检查,但我找不到遍历所有对并提取第一个和第二个值的方法。

(define n '(1 2 3 4 5 6 7 "J" "Q" "K"))
(define s '( #\H #\S #\C #\D))
(define (deck)
  (apply append
       (map (lambda (x)
              (map (lambda (y) (cons x y))
                   s))
            n))
  )
(deck)


#((1 . #\H)
 (1 . #\S)
 (1 . #\C)
 (1 . #\D)
 (2 . #\H)
 (2 . #\S)
 (2 . #\C)
 (2 . #\D)
 (3 . #\H)
 (3 . #\S)
 (3 . #\C)
 (3 . #\D)
 (4 . #\H)
 (4 . #\S)
 (4 . #\C)
 (4 . #\D)
 (5 . #\H)
 (5 . #\S)
 (5 . #\C)
 (5 . #\D)
 (6 . #\H)
 (6 . #\S)
 (6 . #\C)
 (6 . #\D)
 (7 . #\H)
 (7 . #\S)
 (7 . #\C)
 (7 . #\D)
 ("J" . #\H)
 ("J" . #\S)
 ("J" . #\C)
 ("J" . #\D)
 ("Q" . #\H)
 ("Q" . #\S)
 ("Q" . #\C)
 ("Q" . #\D)
 ("K" . #\H)
 ("K" . #\S)
 ("K" . #\C)
 ("K" . #\D))
#

最有希望的解决方案是(filter) the list by applying (member)到每个列表元素的(cdr)来测试它是否是花色的成员。如果需要,您也可以对面部执行相同的操作,一次完成这两项操作是微不足道的。这应该有效:

(define faces '(1 2 3 4 5 6 7 "J" "Q" "K"))
(define suits '( #\H #\S #\C #\D))

(define (deck)
  (apply append
       (map (lambda (x)
              (map (lambda (y) (cons x y))
                   suits))
            faces)))

(define original-deck (deck))

(define (sanitize-deck d)
  (filter (lambda (ls)
            (and (member (car ls) faces)
                 (member (cdr ls) suits)))
          d))

其中 sanitize-deck 的输出是最终所需的输出。