list-utils.scm 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. (define-module (list-utils)
  2. #:export (list-prefix?
  3. make-multiple-recursive-list-remover
  4. make-multiple-list-remover
  5. list-remove-multiple-recursive-equal
  6. list-remove-multiple-recursive-eqv
  7. list-remove-multiple-recursive-eq
  8. list-remove-multiple-equal
  9. list-remove-multiple-eqv
  10. list-remove-multiple-eq
  11. map-to-all-except-last))
  12. (define list-prefix?
  13. (λ (lst lst-prefix)
  14. (cond
  15. [(null? lst-prefix) #t]
  16. [(null? lst) #f]
  17. [else
  18. (cond
  19. [(equal? (car lst) (car lst-prefix))
  20. (list-prefix? (cdr lst) (cdr lst-prefix))]
  21. [else #f])])))
  22. (define make-multiple-recursive-list-remover
  23. ;; multirember*-with-equal-proc
  24. (λ (equal-proc)
  25. (λ (lst unwanted)
  26. (let loop ([remaining-list lst])
  27. (cond
  28. [(null? remaining-list)
  29. '()]
  30. ;; case for finding the unwanted element in the list
  31. [(equal-proc (car remaining-list) unwanted)
  32. (loop (cdr remaining-list))]
  33. ;; case for handling nested lists
  34. [(pair? (car remaining-list))
  35. (cons (loop (car remaining-list))
  36. (loop (cdr remaining-list)))]
  37. [else
  38. (cons (car remaining-list)
  39. (loop (cdr remaining-list)))])))))
  40. (define make-multiple-list-remover
  41. (λ (equal-proc)
  42. (λ (lst unwanted)
  43. (let loop ([remaining-list lst])
  44. (cond
  45. [(null? remaining-list)
  46. '()]
  47. [(equal-proc (car remaining-list) unwanted)
  48. (loop (cdr remaining-list))]
  49. [else
  50. (cons (car remaining-list)
  51. (loop (cdr remaining-list)))])))))
  52. (define list-remove-multiple-recursive-equal
  53. (make-multiple-recursive-list-remover equal?))
  54. (define list-remove-multiple-recursive-eqv
  55. (make-multiple-recursive-list-remover eqv?))
  56. (define list-remove-multiple-recursive-eq
  57. (make-multiple-recursive-list-remover eq?))
  58. (define list-remove-multiple-equal
  59. (make-multiple-list-remover equal?))
  60. (define list-remove-multiple-eqv
  61. (make-multiple-list-remover eqv?))
  62. (define list-remove-multiple-eq
  63. (make-multiple-list-remover eq?))
  64. (define map-to-all-except-last
  65. (λ (proc lst)
  66. (cond
  67. [(null? lst) '()]
  68. [(null? (cdr lst)) lst]
  69. [else
  70. (cons (proc (car lst))
  71. (map-to-all-except-last proc (cdr lst)))])))