vector-util.scm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. ;;; This code is
  2. ;;; Copyright (c) 1998 by Olin Shivers.
  3. ;;; The terms are: You may do as you please with this code, as long as
  4. ;;; you do not delete this notice or hold me responsible for any outcome
  5. ;;; related to its use.
  6. ;;;
  7. ;;; Blah blah blah. Don't you think source files should contain more lines
  8. ;;; of code than copyright notice?
  9. (define (vector-portion-copy vec start end)
  10. (let* ((len (vector-length vec))
  11. (new-len (- end start))
  12. (new (make-vector new-len)))
  13. (do ((i start (+ i 1))
  14. (j 0 (+ j 1)))
  15. ((= i end) new)
  16. (vector-set! new j (vector-ref vec i)))))
  17. (define (vector-copy vec)
  18. (vector-portion-copy vec 0 (vector-length vec)))
  19. (define (vector-portion-copy! target src start end)
  20. (let ((len (- end start)))
  21. (do ((i (- len 1) (- i 1))
  22. (j (- end 1) (- j 1)))
  23. ((< i 0))
  24. (vector-set! target i (vector-ref src j)))))
  25. (define (has-element list index)
  26. (cond
  27. ((zero? index)
  28. (if (pair? list)
  29. (values #t (car list))
  30. (values #f #f)))
  31. ((null? list)
  32. (values #f #f))
  33. (else
  34. (has-element (cdr list) (- index 1)))))
  35. (define (list-ref-or-default list index default)
  36. (call-with-values
  37. (lambda () (has-element list index))
  38. (lambda (has? maybe)
  39. (if has?
  40. maybe
  41. default))))
  42. (define (vector-start+end vector maybe-start+end)
  43. (let ((start (list-ref-or-default maybe-start+end
  44. 0 0))
  45. (end (list-ref-or-default maybe-start+end
  46. 1 (vector-length vector))))
  47. (values start end)))
  48. (define (vectors-start+end-2 vector-1 vector-2 maybe-start+end)
  49. (let ((start-1 (list-ref-or-default maybe-start+end
  50. 0 0))
  51. (end-1 (list-ref-or-default maybe-start+end
  52. 1 (vector-length vector-1)))
  53. (start-2 (list-ref-or-default maybe-start+end
  54. 2 0))
  55. (end-2 (list-ref-or-default maybe-start+end
  56. 3 (vector-length vector-2))))
  57. (values start-1 end-1
  58. start-2 end-2)))