vector.sls 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!r6rs
  2. ;;; Copyright © 2016 Federico Beffa
  3. ;;;
  4. ;;; This program is free software; you can redistribute it and/or modify it
  5. ;;; under the terms of the GNU General Public License as published by
  6. ;;; the Free Software Foundation; either version 3 of the License, or (at
  7. ;;; your option) any later version.
  8. ;;;
  9. ;;; This program is distributed in the hope that it will be useful, but
  10. ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ;;; GNU General Public License for more details.
  13. ;;;
  14. ;;; You should have received a copy of the GNU General Public License
  15. ;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. ;;; Code
  17. (library (mit vector)
  18. (export make-initialized-vector flo:flonum?
  19. flo:vector-cons flo:vector-length flo:vector-ref
  20. flo:vector-set! flo:vector? flo:subvector
  21. subvector vector-head
  22. subvector-move-left! subvector-fill!
  23. guarantee-vector guarantee-subvector guarantee-subvector-range
  24. vector-tail)
  25. (import (except (rnrs) error assert)
  26. (prefix (only (rnrs) error) chez:)
  27. (mit core)
  28. (mit arithmetic))
  29. (define (make-initialized-vector length initialization)
  30. ;; LENGTH is checked by MAKE-VECTOR
  31. (let ((vector (make-vector length)))
  32. (let loop ((index 0))
  33. (if (fix:< index length)
  34. (begin
  35. (vector-set! vector index (initialization index))
  36. (loop (fix:+ index 1)))))
  37. vector))
  38. (define (flo:flonum? obj) (or (flonum? obj) (flo:vector? obj)))
  39. (define flo:vector-cons make-vector)
  40. (define flo:vector-length vector-length)
  41. (define flo:vector-ref vector-ref)
  42. (define flo:vector-set! vector-set!)
  43. (define flo:vector? vector?)
  44. (define (flo:subvector vector start end)
  45. (let* ((idx-end (- end start))
  46. (sv (flo:vector-cons idx-end)))
  47. (let loop ((i 0))
  48. (when (< i idx-end)
  49. (flo:vector-set! sv i (flo:vector-ref vector (+ start i)))
  50. (loop (+ 1 i))))
  51. sv))
  52. (define (subvector vector start end)
  53. (let* ((idx-end (- end start))
  54. (sv (make-vector idx-end)))
  55. (let loop ((i 0))
  56. (when (< i idx-end)
  57. (vector-set! sv i (vector-ref vector (+ start i)))
  58. (loop (+ 1 i))))
  59. sv))
  60. (define (vector-head vector end)
  61. (subvector vector 0 end))
  62. (define (subvector-move-left! v1 start1 end1 v2 start2)
  63. (guarantee-exact-nonnegative-integer start1 'subvector-move-left!)
  64. (guarantee-exact-nonnegative-integer start2 'subvector-move-left!)
  65. (guarantee-exact-nonnegative-integer end1 'subvector-move-left!)
  66. (guarantee-vector v1 'subvector-move-left!)
  67. (guarantee-vector v2 'subvector-move-left!)
  68. (unless (and (<= (vector-length v1) end1)
  69. (<= (- end1 start1) (- (vector-length v2) start2)))
  70. (error 'subvector-move-left! "Invalid index" start1 end1 start2))
  71. (let loop ((i 0))
  72. (when (< i (- end1 start1))
  73. (vector-set! v2 (+ start2 i) (vector-ref v1 (+ start1 i)))
  74. (loop (+ i 1)))))
  75. (define (subvector-fill! vector start end value)
  76. (guarantee-subvector vector start end 'SUBVECTOR-FILL!)
  77. (do ((i start (+ i 1)))
  78. ((= i end) unspecific)
  79. (vector-set! vector i value)))
  80. (define (guarantee-vector object procedure)
  81. (if (not (vector? object))
  82. (chez:error procedure "Not a vector" object)))
  83. (define (guarantee-subvector v s e procedure)
  84. (guarantee-vector v procedure)
  85. (guarantee-exact-nonnegative-integer s procedure)
  86. (guarantee-exact-nonnegative-integer e procedure)
  87. (guarantee-subvector-range v s e procedure))
  88. (define (guarantee-subvector-range v s e procedure)
  89. (if (not (fix:<= s e))
  90. (error ":bad-range-argument" s procedure))
  91. (if (not (fix:<= e (vector-length v)))
  92. (error ":bad-range-argument" e procedure)))
  93. (define (vector-tail vector start)
  94. (guarantee-vector vector 'VECTOR-TAIL)
  95. (subvector vector start (vector-length vector)))
  96. )