2011-02-22 1 views
0
(define filter-in 
    (lambda (predicate list) 
    (let((f 
     (lambda (l) 
      (filter-in-sexpr predicate l)))) 
    (map f list)))) 

(define filter-in-aux 
    (lambda (pred lst) 
    (if (null? lst) '() 
     (cons (filter-in-sexpr pred (car lst)) 
       (filter-in-aux pred (cdr lst)))))) 

(define filter-in-sexpr 
    (lambda (pred sexpr) 
    (if (equal? (pred sexpr) #t) 
      sexpr 
      '()))) 

(フィルタリング番号? '(a 2(1 3)b 7))は(()2()()7)を生成します。スキームリストからヌル要素を削除する

(2 7)の最終結果を得るために、生成されたリストからnull要素をスキップする方法はありますか?

答えて

1

問題は、filter-in-sxprをリストにマッピングしていることです。別のフィルタパスを実行してヌルを削除するか、または次のように変更したfilter-in-auxを使用できます。

(define filter-in-aux 
    (lambda (pred lst) 
    (if (null? lst) '() 
     (let ((h (filter-in-sexpr pred (car lst))) 
       (t (filter-in-aux pred (cdr lst)))) 
      (if (null? h) t 
       (cons h t)))))) 
関連する問題