utils.rkt 914 B

123456789101112131415161718192021222324252627282930313233343536
  1. #lang racket
  2. (provide get-lines
  3. enumerate
  4. repeat
  5. split-list-by)
  6. (define (repeat n e)
  7. (let loop ((i 0) (ret '()))
  8. (if (>= i n)
  9. ret
  10. (loop (+ 1 i) (cons e ret)))))
  11. (define (get-lines fp)
  12. (let loop ((lines '()))
  13. (define l (read-line fp))
  14. (if (eof-object? l)
  15. (reverse lines)
  16. (loop (cons l lines)))))
  17. (define (enumerate lst)
  18. (let loop ((i 1) (ret '()) (remain lst))
  19. (if (null? remain)
  20. (reverse ret)
  21. (loop (+ 1 i) (cons (list (car remain) i) ret) (cdr remain)))))
  22. (define (split-list-by e lst . eq)
  23. (define cmp (if (null? eq) equal? eq))
  24. (let loop ((ret '())
  25. (cur '())
  26. (lst lst))
  27. (if (null? lst)
  28. (reverse (cons (reverse cur) ret))
  29. (if (cmp e (car lst))
  30. (loop (cons (reverse cur) ret) '() (cdr lst))
  31. (loop ret (cons (car lst) cur) (cdr lst))))))