complex.scm 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. ;;; SPDX-License-Identifier: MIT
  2. ;;; SPDX-FileCopyrightText: 2018 John Cowan
  3. ;;;; Implementation of SRFI 160 base c64vectors and c128vectors
  4. ;;; Main constructor
  5. (define (make-c64vector len . maybe-fill)
  6. (define vec (raw-make-c64vector (make-f32vector (* len 2))))
  7. (if (not (null? maybe-fill))
  8. (c64vector-simple-fill! vec (car maybe-fill)))
  9. vec)
  10. (define (make-c128vector len . maybe-fill)
  11. (define vec (raw-make-c128vector (make-f64vector (* len 2))))
  12. (if (not (null? maybe-fill))
  13. (c128vector-simple-fill! vec (car maybe-fill)))
  14. vec)
  15. ;; Simple fill! (not exported)
  16. (define (c64vector-simple-fill! vec value)
  17. (define len (c64vector-length vec))
  18. (let loop ((i 0))
  19. (if (= i len)
  20. vec
  21. (begin
  22. (c64vector-set! vec i value)
  23. (loop (+ i 1))))))
  24. (define (c128vector-simple-fill! vec value)
  25. (define len (c128vector-length vec))
  26. (let loop ((i 0))
  27. (if (= i len)
  28. vec
  29. (begin
  30. (c128vector-set! vec i value)
  31. (loop (+ i 1))))))
  32. ;;; Variable-argument constructor
  33. (define (c64vector . list)
  34. (list->c64vector list))
  35. (define (c128vector . list)
  36. (list->c128vector list))
  37. ;; Predicate already defined
  38. ;; Length
  39. (define (c64vector-length vec)
  40. (/ (f32vector-length (bv64 vec)) 2))
  41. (define (c128vector-length vec)
  42. (/ (f64vector-length (bv128 vec)) 2))
  43. ;; Get element
  44. (define (c64vector-ref vec i)
  45. (let ((fvec (bv64 vec))
  46. (j (* i 2)))
  47. (make-rectangular
  48. (f32vector-ref fvec j)
  49. (f32vector-ref fvec (+ j 1)))))
  50. (define (c128vector-ref vec i)
  51. (let ((fvec (bv128 vec))
  52. (j (* i 2)))
  53. (make-rectangular
  54. (f64vector-ref fvec j)
  55. (f64vector-ref fvec (+ j 1)))))
  56. ;; Set element
  57. (define (c64vector-set! vec i value)
  58. (let ((fvec (bv64 vec))
  59. (j (* i 2)))
  60. (f32vector-set! fvec j (real-part value))
  61. (f32vector-set! fvec (+ j 1) (imag-part value))))
  62. (define (c128vector-set! vec i value)
  63. (let ((fvec (bv128 vec))
  64. (j (* i 2)))
  65. (f64vector-set! fvec j (real-part value))
  66. (f64vector-set! fvec (+ j 1) (imag-part value))))
  67. ;; List to vec
  68. (define (list->c64vector list)
  69. (define len (length list))
  70. (define vec (make-c64vector len))
  71. (let loop ((i 0) (list list))
  72. (if (= i len)
  73. vec
  74. (begin
  75. (c64vector-set! vec i (car list))
  76. (loop (+ i 1) (cdr list))))))
  77. (define (list->c128vector list)
  78. (define len (length list))
  79. (define vec (make-c128vector len))
  80. (let loop ((i 0) (list list))
  81. (if (= i len)
  82. vec
  83. (begin
  84. (c128vector-set! vec i (car list))
  85. (loop (+ i 1) (cdr list))))))
  86. ;; Vec to list defined in at-vector2list