如何防止列表输出中的void

时间:2016-12-14 05:44:00

标签: list scheme racket void

当我在列表中使用when时,#<void>经常会不经常出现。以下是使用map和for / list的示例。

;; using map    
(define lst '(0 0 0 1 1 1 2 2 2 3 3))
    (map (lambda (x)
             (when (equal? 2 x)
                 x
                 ))
           lst)   
;; expected => '(2 2 2)
;; output => '(#<void>  #<void>  #<void>  #<void>  #<void>  #<void>
;; 2  2  2  #<void>  #<void>)

;; using for/list
    (define my-list '(0 0 0 1 2 1 2 2 2))
     (for/list ([a (drop-right my-list 1)]
                           [b (cdr lst)]
                           [i (in-naturals)])
                  (when (> a b)
                    (list a b i)))
;; expected => '(2 1 4)
;; output => '(#<void> #<void> #<void> #<void> (2 1 4) #<void> #<void> #<void>)

当我使用if条件时,我没有为#false州提供任何其他内容。如何阻止#<void>

2 个答案:

答案 0 :(得分:3)

在这些情况下,您不应使用mapfor/list:它们将相同的操作应用于对象列表,并返回通过应用程序的所有结果获得的列表。因此,由于when没有其他选择,当条件为假时,结果为#<void>

使用预定义的运算符filter代替:

(filter (lambda (x) (equal? x 2)) '(0 0 0 1 2 1 2 2 2))
;; => '(2 2 2 2)

答案 1 :(得分:2)

Renzo所述,如果您的目标是实际过滤,则可以使用filter。但是,值得一提的是,通过在循环中使用for/list子句,可以使用#:when

(define lst '(0 0 0 1 1 1 2 2 2 3 3))
(define my-list '(0 0 0 1 2 1 2 2 2))

(for/list ([a (drop-right my-list 1)]
           [b (cdr lst)]
           [i (in-naturals)]
           #:when (> a b))
  (list a b i))

; => '((2 1 4))