我的 Scheme 使用向量集实现有什么问题?

What is wrong with my Scheme using vector-set implementation?

我想知道我在这里使用矢量集做错了什么

(define foo0
  (lambda (vec)
    (let* ((newvec (vector vec))
           (l      (vector-length vec))
           (norm   (norm0 vec)))
      (do ((i 0(+ i 1)))
        ((= i l))
        (vector-set*! newvec  i (/(vector-ref vec i) norm))) newvec)))

我正在尝试将向量的每个元素设置为除以范数(来自另一个谓词的整数)。

我不断收到的错误是

  vector-set!: index is out of range
  index: 1
  valid range: [0, 0]
  vector: '#(3/4)

所以我找到了第一个解决方案,但是,newvec 被重置为大小 1,因此索引超出了范围。

在你程序的第二行,你写(vector vec)。这意味着什么?

vector 生成一个可变向量,其中的元素作为参数给出,因此:

(vector 4)      ; a vector of one element
(vector 1 2 3)  ; a vector of 3 elements

所以假设您需要一个包含 20 个元素的向量,您将对其进行变异和处理。使用 vector 是不可能的,因为那时你必须有 20 个虚拟参数。相反,你使用 make-vector 它有两个参数,大小和所有元素的可选初始值:

(make-vector 20 0)
; ==> #(0 0 ... 0), a vector of 20 elements, all 0

现在知道您可以使用 vector-length 获取传递的向量的长度,您可以将其传递给 make-vector 以制作相同大小的向量,您可以将值复制到其中以制作浅拷贝。但是,使用 vector-copy

可以更轻松地做到这一点