2016-12-14 11 views
0

whenをリストに使用すると、#<void>が非常に頻繁に出てきます。以下は、mapとfor/listの使用例です。私が代わりにif条件を使用する場合リスト出力時のボイドを防ぐ方法

;; 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>) 

は、私が#false状態のために置くために何かを持っていません。それらを防ぐには#<void>?オブジェクトのリストに、彼らは同じ操作を適用し、コンスアプリケーションのすべての結果によって得られたリストを返す:

答えて

2

Renzoとしてあなたの目標は、実際にフィルタリングされている場合、あなたはfilterを使用することができます。

ではなく、事前に定義されたオペレータfilterを使用してください。

(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)) 
:しかし、それはまた、あなたが ループで #:when句を使用して、このため for/listを使用することができることを言及する価値があります
3

これらのケースでは、mapfor/listを使用しないでください。したがって、whenには選択肢がないため、条件がfalseの場合、結果は#<void>になります。言及

(filter (lambda (x) (equal? x 2)) '(0 0 0 1 2 1 2 2 2)) 
;; => '(2 2 2 2) 
関連する問題