f64-impl.scm 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. ;;; SPDX-License-Identifier: MIT
  2. ;;; SPDX-FileCopyrightText: 2018 John Cowan
  3. ;;; This code is the same for all SRFI 160 vector sizes.
  4. ;;; The f64s appearing in the code are expanded to u8, s8, etc.
  5. ;; make-f64vector defined in (srfi 160 base)
  6. ;; f64vector defined in (srfi 160 base)
  7. (define (f64vector-unfold f len seed)
  8. (let ((v (make-f64vector len)))
  9. (let loop ((i 0) (state seed))
  10. (unless (= i len)
  11. (let-values (((value newstate) (f i state)))
  12. (f64vector-set! v i value)
  13. (loop (+ i 1) newstate))))
  14. v))
  15. (define (f64vector-unfold-right f len seed)
  16. (let ((v (make-f64vector len)))
  17. (let loop ((i (- len 1)) (state seed))
  18. (unless (= i -1)
  19. (let-values (((value newstate) (f i state)))
  20. (f64vector-set! v i value)
  21. (loop (- i 1) newstate))))
  22. v))
  23. (define f64vector-copy
  24. (case-lambda
  25. ((vec) (f64vector-copy* vec 0 (f64vector-length vec)))
  26. ((vec start) (f64vector-copy* vec start (f64vector-length vec)))
  27. ((vec start end) (f64vector-copy* vec start end))))
  28. (define (f64vector-copy* vec start end)
  29. (let ((v (make-f64vector (- end start))))
  30. (f64vector-copy! v 0 vec start end)
  31. v))
  32. (define f64vector-copy!
  33. (case-lambda
  34. ((to at from)
  35. (f64vector-copy!* to at from 0 (f64vector-length from)))
  36. ((to at from start)
  37. (f64vector-copy!* to at from start (f64vector-length from)))
  38. ((to at from start end) (f64vector-copy!* to at from start end))))
  39. (define (f64vector-copy!* to at from start end)
  40. (let loop ((at at) (i start))
  41. (unless (= i end)
  42. (f64vector-set! to at (f64vector-ref from i))
  43. (loop (+ at 1) (+ i 1)))))
  44. (define f64vector-reverse-copy
  45. (case-lambda
  46. ((vec) (f64vector-reverse-copy* vec 0 (f64vector-length vec)))
  47. ((vec start) (f64vector-reverse-copy* vec start (f64vector-length vec)))
  48. ((vec start end) (f64vector-reverse-copy* vec start end))))
  49. (define (f64vector-reverse-copy* vec start end)
  50. (let ((v (make-f64vector (- end start))))
  51. (f64vector-reverse-copy! v 0 vec start end)
  52. v))
  53. (define f64vector-reverse-copy!
  54. (case-lambda
  55. ((to at from)
  56. (f64vector-reverse-copy!* to at from 0 (f64vector-length from)))
  57. ((to at from start)
  58. (f64vector-reverse-copy!* to at from start (f64vector-length from)))
  59. ((to at from start end) (f64vector-reverse-copy!* to at from start end))))
  60. (define (f64vector-reverse-copy!* to at from start end)
  61. (let loop ((at at) (i (- end 1)))
  62. (unless (< i start)
  63. (f64vector-set! to at (f64vector-ref from i))
  64. (loop (+ at 1) (- i 1)))))
  65. (define (f64vector-append . vecs)
  66. (f64vector-concatenate vecs))
  67. (define (f64vector-concatenate vecs)
  68. (let ((v (make-f64vector (len-sum vecs))))
  69. (let loop ((vecs vecs) (at 0))
  70. (unless (null? vecs)
  71. (let ((vec (car vecs)))
  72. (f64vector-copy! v at vec 0 (f64vector-length vec))
  73. (loop (cdr vecs) (+ at (f64vector-length vec)))))
  74. v)))
  75. (define (len-sum vecs)
  76. (if (null? vecs)
  77. 0
  78. (+ (f64vector-length (car vecs))
  79. (len-sum (cdr vecs)))))
  80. (define (f64vector-append-subvectors . args)
  81. (let ((v (make-f64vector (len-subsum args))))
  82. (let loop ((args args) (at 0))
  83. (unless (null? args)
  84. (let ((vec (car args))
  85. (start (cadr args))
  86. (end (caddr args)))
  87. (f64vector-copy! v at vec start end)
  88. (loop (cdddr args) (+ at (- end start))))))
  89. v))
  90. (define (len-subsum vecs)
  91. (if (null? vecs)
  92. 0
  93. (+ (- (caddr vecs) (cadr vecs))
  94. (len-subsum (cdddr vecs)))))
  95. ;; f64? defined in (srfi 160 base)
  96. ;; f64vector? defined in (srfi 160 base)
  97. (define (f64vector-empty? vec)
  98. (zero? (f64vector-length vec)))
  99. (define (f64vector= . vecs)
  100. (f64vector=* (car vecs) (cadr vecs) (cddr vecs)))
  101. (define (f64vector=* vec1 vec2 vecs)
  102. (and (f64dyadic-vecs= vec1 0 (f64vector-length vec1)
  103. vec2 0 (f64vector-length vec2))
  104. (or (null? vecs)
  105. (f64vector=* vec2 (car vecs) (cdr vecs)))))
  106. (define (f64dyadic-vecs= vec1 start1 end1 vec2 start2 end2)
  107. (cond
  108. ((not (= end1 end2)) #f)
  109. ((not (< start1 end1)) #t)
  110. ((let ((elt1 (f64vector-ref vec1 start1))
  111. (elt2 (f64vector-ref vec2 start2)))
  112. (= elt1 elt2))
  113. (f64dyadic-vecs= vec1 (+ start1 1) end1
  114. vec2 (+ start2 1) end2))
  115. (else #f)))
  116. ;; f64vector-ref defined in (srfi 160 base)
  117. ;; f64vector-length defined in (srfi 160 base)
  118. (define (f64vector-take vec n)
  119. (let ((v (make-f64vector n)))
  120. (f64vector-copy! v 0 vec 0 n)
  121. v))
  122. (define (f64vector-take-right vec n)
  123. (let ((v (make-f64vector n))
  124. (len (f64vector-length vec)))
  125. (f64vector-copy! v 0 vec (- len n) len)
  126. v))
  127. (define (f64vector-drop vec n)
  128. (let* ((len (f64vector-length vec))
  129. (vlen (- len n))
  130. (v (make-f64vector vlen)))
  131. (f64vector-copy! v 0 vec n len)
  132. v))
  133. (define (f64vector-drop-right vec n)
  134. (let* ((len (f64vector-length vec))
  135. (rlen (- len n))
  136. (v (make-f64vector rlen)))
  137. (f64vector-copy! v 0 vec 0 rlen)
  138. v))
  139. (define (f64vector-segment vec n)
  140. (unless (and (integer? n) (positive? n))
  141. (error "length must be a positive integer" n))
  142. (let loop ((r '()) (i 0) (remain (f64vector-length vec)))
  143. (if (<= remain 0)
  144. (reverse r)
  145. (let ((size (min n remain)))
  146. (loop
  147. (cons (f64vector-copy vec i (+ i size)) r)
  148. (+ i size)
  149. (- remain size))))))
  150. ;; aux. procedure
  151. (define (%f64vectors-ref vecs i)
  152. (map (lambda (v) (f64vector-ref v i)) vecs))
  153. (define (f64vector-fold kons knil vec . vecs)
  154. (if (null? vecs)
  155. ;; fast path
  156. (let ((len (f64vector-length vec)))
  157. (let loop ((r knil) (i 0))
  158. (if (= i len)
  159. r
  160. (loop (kons r (f64vector-ref vec i)) (+ i 1)))))
  161. ;; generic case
  162. (let* ((vecs (cons vec vecs))
  163. (len (apply min (map f64vector-length vecs))))
  164. (let loop ((r knil) (i 0))
  165. (if (= i len)
  166. r
  167. (loop (apply kons r (%f64vectors-ref vecs i))
  168. (+ i 1)))))))
  169. (define (f64vector-fold-right kons knil vec . vecs)
  170. (if (null? vecs)
  171. ;; fast path
  172. (let ((len (f64vector-length vec)))
  173. (let loop ((r knil) (i (- (f64vector-length vec) 1)))
  174. (if (negative? i)
  175. r
  176. (loop (kons r (f64vector-ref vec i)) (- i 1)))))
  177. ;; generic case
  178. (let* ((vecs (cons vec vecs))
  179. (len (apply min (map f64vector-length vecs))))
  180. (let loop ((r knil) (i (- len 1)))
  181. (if (negative? i)
  182. r
  183. (loop (apply kons r (%f64vectors-ref vecs i))
  184. (- i 1)))))))
  185. (define (f64vector-map f vec . vecs)
  186. (if (null? vecs)
  187. ;; fast path
  188. (let* ((len (f64vector-length vec))
  189. (v (make-f64vector len)))
  190. (let loop ((i 0))
  191. (unless (= i len)
  192. (f64vector-set! v i (f (f64vector-ref vec i)))
  193. (loop (+ i 1))))
  194. v)
  195. ;; generic case
  196. (let* ((vecs (cons vec vecs))
  197. (len (apply min (map f64vector-length vecs)))
  198. (v (make-f64vector len)))
  199. (let loop ((i 0))
  200. (unless (= i len)
  201. (f64vector-set! v i (apply f (%f64vectors-ref vecs i)))
  202. (loop (+ i 1))))
  203. v)))
  204. (define (f64vector-map! f vec . vecs)
  205. (if (null? vecs)
  206. ;; fast path
  207. (let ((len (f64vector-length vec)))
  208. (let loop ((i 0))
  209. (unless (= i len)
  210. (f64vector-set! vec i (f (f64vector-ref vec i)))
  211. (loop (+ i 1)))))
  212. ;; generic case
  213. (let* ((vecs (cons vec vecs))
  214. (len (apply min (map f64vector-length vecs))))
  215. (let loop ((i 0))
  216. (unless (= i len)
  217. (f64vector-set! vec i (apply f (%f64vectors-ref vecs i)))
  218. (loop (+ i 1)))))))
  219. (define (f64vector-for-each f vec . vecs)
  220. (if (null? vecs)
  221. ;; fast path
  222. (let ((len (f64vector-length vec)))
  223. (let loop ((i 0))
  224. (unless (= i len)
  225. (f (f64vector-ref vec i))
  226. (loop (+ i 1)))))
  227. ;; generic case
  228. (let* ((vecs (cons vec vecs))
  229. (len (apply min (map f64vector-length vecs))))
  230. (let loop ((i 0))
  231. (unless (= i len)
  232. (apply f (%f64vectors-ref vecs i))
  233. (loop (+ i 1)))))))
  234. (define (f64vector-count pred vec . vecs)
  235. (if (null? vecs)
  236. ;; fast path
  237. (let ((len (f64vector-length vec)))
  238. (let loop ((i 0) (r 0))
  239. (cond
  240. ((= i (f64vector-length vec)) r)
  241. ((pred (f64vector-ref vec i)) (loop (+ i 1) (+ r 1)))
  242. (else (loop (+ i 1) r)))))
  243. ;; generic case
  244. (let* ((vecs (cons vec vecs))
  245. (len (apply min (map f64vector-length vecs))))
  246. (let loop ((i 0) (r 0))
  247. (cond
  248. ((= i len) r)
  249. ((apply pred (%f64vectors-ref vecs i)) (loop (+ i 1) (+ r 1)))
  250. (else (loop (+ i 1) r)))))))
  251. (define (f64vector-cumulate f knil vec)
  252. (let* ((len (f64vector-length vec))
  253. (v (make-f64vector len)))
  254. (let loop ((r knil) (i 0))
  255. (unless (= i len)
  256. (let ((next (f r (f64vector-ref vec i))))
  257. (f64vector-set! v i next)
  258. (loop next (+ i 1)))))
  259. v))
  260. (define (f64vector-foreach f vec)
  261. (let ((len (f64vector-length vec)))
  262. (let loop ((i 0))
  263. (unless (= i len)
  264. (f (f64vector-ref vec i))
  265. (loop (+ i 1))))))
  266. (define (f64vector-take-while pred vec)
  267. (let* ((len (f64vector-length vec))
  268. (idx (f64vector-skip pred vec))
  269. (idx* (if idx idx len)))
  270. (f64vector-copy vec 0 idx*)))
  271. (define (f64vector-take-while-right pred vec)
  272. (let* ((len (f64vector-length vec))
  273. (idx (f64vector-skip-right pred vec))
  274. (idx* (if idx (+ idx 1) 0)))
  275. (f64vector-copy vec idx* len)))
  276. (define (f64vector-drop-while pred vec)
  277. (let* ((len (f64vector-length vec))
  278. (idx (f64vector-skip pred vec))
  279. (idx* (if idx idx len)))
  280. (f64vector-copy vec idx* len)))
  281. (define (f64vector-drop-while-right pred vec)
  282. (let* ((len (f64vector-length vec))
  283. (idx (f64vector-skip-right pred vec))
  284. (idx* (if idx idx -1)))
  285. (f64vector-copy vec 0 (+ 1 idx*))))
  286. (define (f64vector-index pred vec . vecs)
  287. (if (null? vecs)
  288. ;; fast path
  289. (let ((len (f64vector-length vec)))
  290. (let loop ((i 0))
  291. (cond
  292. ((= i len) #f)
  293. ((pred (f64vector-ref vec i)) i)
  294. (else (loop (+ i 1))))))
  295. ;; generic case
  296. (let* ((vecs (cons vec vecs))
  297. (len (apply min (map f64vector-length vecs))))
  298. (let loop ((i 0))
  299. (cond
  300. ((= i len) #f)
  301. ((apply pred (%f64vectors-ref vecs i)) i)
  302. (else (loop (+ i 1))))))))
  303. (define (f64vector-index-right pred vec . vecs)
  304. (if (null? vecs)
  305. ;; fast path
  306. (let ((len (f64vector-length vec)))
  307. (let loop ((i (- len 1)))
  308. (cond
  309. ((negative? i) #f)
  310. ((pred (f64vector-ref vec i)) i)
  311. (else (loop (- i 1))))))
  312. ;; generic case
  313. (let* ((vecs (cons vec vecs))
  314. (len (apply min (map f64vector-length vecs))))
  315. (let loop ((i (- len 1)))
  316. (cond
  317. ((negative? i) #f)
  318. ((apply pred (%f64vectors-ref vecs i)) i)
  319. (else (loop (- i 1))))))))
  320. (define (f64vector-skip pred vec . vecs)
  321. (if (null? vecs)
  322. (f64vector-index (lambda (x) (not (pred x))) vec)
  323. (apply f64vector-index (lambda xs (not (apply pred xs))) vec vecs)))
  324. (define (f64vector-skip-right pred vec . vecs)
  325. (if (null? vecs)
  326. (f64vector-index-right (lambda (x) (not (pred x))) vec)
  327. (apply f64vector-index-right (lambda xs (not (apply pred xs))) vec vecs)))
  328. (define (f64vector-any pred vec . vecs)
  329. (if (null? vecs)
  330. ;; fast path
  331. (let ((len (f64vector-length vec)))
  332. (let loop ((i 0))
  333. (cond
  334. ((= i len) #f)
  335. ((pred (f64vector-ref vec i))) ;returns result of pred
  336. (else (loop (+ i 1))))))
  337. ;; generic case
  338. (let* ((vecs (cons vec vecs))
  339. (len (apply min (map f64vector-length vecs))))
  340. (let loop ((i 0))
  341. (cond
  342. ((= i len) #f)
  343. ((apply pred (%f64vectors-ref vecs i))) ;returns result of pred
  344. (else (loop (+ i 1))))))))
  345. (define (f64vector-every pred vec . vecs)
  346. (if (null? vecs)
  347. ;; fast path
  348. (let ((len (f64vector-length vec)))
  349. (let loop ((i 0) (last #t))
  350. (cond
  351. ((= i len) last)
  352. ((pred (f64vector-ref vec i)) => (lambda (r) (loop (+ i 1) r)))
  353. (else #f))))
  354. ;; generic case
  355. (let* ((vecs (cons vec vecs))
  356. (len (apply min (map f64vector-length vecs))))
  357. (let loop ((i 0) (last #t))
  358. (cond
  359. ((= i len) last)
  360. ((apply pred (%f64vectors-ref vecs i)) => (lambda (r) (loop (+ i 1) r)))
  361. (else #f))))))
  362. (define (f64vector-partition pred vec)
  363. (let* ((len (f64vector-length vec))
  364. (cnt (f64vector-count pred vec))
  365. (r (make-f64vector len)))
  366. (let loop ((i 0) (yes 0) (no cnt))
  367. (cond
  368. ((= i len) (values r cnt))
  369. ((pred (f64vector-ref vec i))
  370. (f64vector-set! r yes (f64vector-ref vec i))
  371. (loop (+ i 1) (+ yes 1) no))
  372. (else
  373. (f64vector-set! r no (f64vector-ref vec i))
  374. (loop (+ i 1) yes (+ no 1)))))))
  375. (define (f64vector-filter pred vec)
  376. (let* ((len (f64vector-length vec))
  377. (cnt (f64vector-count pred vec))
  378. (r (make-f64vector cnt)))
  379. (let loop ((i 0) (j 0))
  380. (cond
  381. ((= i len) r)
  382. ((pred (f64vector-ref vec i))
  383. (f64vector-set! r j (f64vector-ref vec i))
  384. (loop (+ i 1) (+ j 1)))
  385. (else
  386. (loop (+ i 1) j))))))
  387. (define (f64vector-remove pred vec)
  388. (f64vector-filter (lambda (x) (not (pred x))) vec))
  389. ;; f64vector-set! defined in (srfi 160 base)
  390. (define (f64vector-swap! vec i j)
  391. (let ((ival (f64vector-ref vec i))
  392. (jval (f64vector-ref vec j)))
  393. (f64vector-set! vec i jval)
  394. (f64vector-set! vec j ival)))
  395. (define f64vector-fill!
  396. (case-lambda
  397. ((vec fill) (f64vector-fill-some! vec fill 0 (f64vector-length vec)))
  398. ((vec fill start) (f64vector-fill-some! vec fill start (f64vector-length vec)))
  399. ((vec fill start end) (f64vector-fill-some! vec fill start end))))
  400. (define (f64vector-fill-some! vec fill start end)
  401. (unless (= start end)
  402. (f64vector-set! vec start fill)
  403. (f64vector-fill-some! vec fill (+ start 1) end)))
  404. (define f64vector-reverse!
  405. (case-lambda
  406. ((vec) (f64vector-reverse-some! vec 0 (f64vector-length vec)))
  407. ((vec start) (f64vector-reverse-some! vec start (f64vector-length vec)))
  408. ((vec start end) (f64vector-reverse-some! vec start end))))
  409. (define (f64vector-reverse-some! vec start end)
  410. (let loop ((i start) (j (- end 1)))
  411. (when (< i j)
  412. (f64vector-swap! vec i j)
  413. (loop (+ i 1) (- j 1)))))
  414. (define (f64vector-unfold! f vec start end seed)
  415. (let loop ((i start) (seed seed))
  416. (when (< i end)
  417. (let-values (((elt seed) (f i seed)))
  418. (f64vector-set! vec i elt)
  419. (loop (+ i 1) seed)))))
  420. (define (f64vector-unfold-right! f vec start end seed)
  421. (let loop ((i (- end 1)) (seed seed))
  422. (when (>= i start)
  423. (let-values (((elt seed) (f i seed)))
  424. (f64vector-set! vec i elt)
  425. (loop (- i 1) seed)))))
  426. (define reverse-f64vector->list
  427. (case-lambda
  428. ((vec) (reverse-f64vector->list* vec 0 (f64vector-length vec)))
  429. ((vec start) (reverse-f64vector->list* vec start (f64vector-length vec)))
  430. ((vec start end) (reverse-f64vector->list* vec start end))))
  431. (define (reverse-f64vector->list* vec start end)
  432. (let loop ((i start) (r '()))
  433. (if (= i end)
  434. r
  435. (loop (+ 1 i) (cons (f64vector-ref vec i) r)))))
  436. (define (reverse-list->f64vector list)
  437. (let* ((len (length list))
  438. (r (make-f64vector len)))
  439. (let loop ((i 0) (list list))
  440. (cond
  441. ((= i len) r)
  442. (else
  443. (f64vector-set! r (- len i 1) (car list))
  444. (loop (+ i 1) (cdr list)))))))
  445. (define f64vector->vector
  446. (case-lambda
  447. ((vec) (f64vector->vector* vec 0 (f64vector-length vec)))
  448. ((vec start) (f64vector->vector* vec start (f64vector-length vec)))
  449. ((vec start end) (f64vector->vector* vec start end))))
  450. (define (f64vector->vector* vec start end)
  451. (let* ((len (- end start))
  452. (r (make-vector len)))
  453. (let loop ((i start) (o 0))
  454. (cond
  455. ((= i end) r)
  456. (else
  457. (vector-set! r o (f64vector-ref vec i))
  458. (loop (+ i 1) (+ o 1)))))))
  459. (define vector->f64vector
  460. (case-lambda
  461. ((vec) (vector->f64vector* vec 0 (vector-length vec)))
  462. ((vec start) (vector->f64vector* vec start (vector-length vec)))
  463. ((vec start end) (vector->f64vector* vec start end))))
  464. (define (vector->f64vector* vec start end)
  465. (let* ((len (- end start))
  466. (r (make-f64vector len)))
  467. (let loop ((i start) (o 0))
  468. (cond
  469. ((= i end) r)
  470. (else
  471. (f64vector-set! r o (vector-ref vec i))
  472. (loop (+ i 1) (+ o 1)))))))
  473. (define make-f64vector-generator
  474. (case-lambda ((vec) (make-f64vector-generator vec 0 (f64vector-length vec)))
  475. ((vec start) (make-f64vector-generator vec start (f64vector-length vec)))
  476. ((vec start end)
  477. (lambda () (if (>= start end)
  478. (eof-object)
  479. (let ((next (f64vector-ref vec start)))
  480. (set! start (+ start 1))
  481. next))))))
  482. (define write-f64vector
  483. (case-lambda
  484. ((vec) (write-f64vector* vec (current-output-port)))
  485. ((vec port) (write-f64vector* vec port))))
  486. (define (write-f64vector* vec port)
  487. (display "#f64(" port) ; f64-expansion is blind, so will expand this too
  488. (let ((last (- (f64vector-length vec) 1)))
  489. (let loop ((i 0))
  490. (cond
  491. ((= i last)
  492. (write (f64vector-ref vec i) port)
  493. (display ")" port))
  494. (else
  495. (write (f64vector-ref vec i) port)
  496. (display " " port)
  497. (loop (+ i 1)))))))
  498. (define (f64vector< vec1 vec2)
  499. (let ((len1 (f64vector-length vec1))
  500. (len2 (f64vector-length vec2)))
  501. (cond
  502. ((< len1 len2)
  503. #t)
  504. ((> len1 len2)
  505. #f)
  506. (else
  507. (let loop ((i 0))
  508. (cond
  509. ((= i len1)
  510. #f)
  511. ((< (f64vector-ref vec1 i) (f64vector-ref vec2 i))
  512. #t)
  513. ((> (f64vector-ref vec1 i) (f64vector-ref vec2 i))
  514. #f)
  515. (else
  516. (loop (+ i 1)))))))))
  517. (define (f64vector-hash vec)
  518. (let ((len (min 256 (f64vector-length vec))))
  519. (let loop ((i 0) (r 0))
  520. (if (= i len)
  521. (abs (floor (real-part (inexact->exact r))))
  522. (loop (+ i 1) (+ r (f64vector-ref vec i)))))))
  523. (define f64vector-comparator
  524. (make-comparator f64vector? f64vector= f64vector< f64vector-hash))