Vector 我使用向量集实现的方案有什么问题?

Vector 我使用向量集实现的方案有什么问题?,vector,scheme,lisp,racket,normalization,Vector,Scheme,Lisp,Racket,Normalization,我想知道我在向量集上做错了什么 (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) nor

我想知道我在向量集上做错了什么

(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 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 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

现在,您可以通过
向量长度
获得传递向量的长度,您可以将其传递到
生成向量
以生成与复制值相同大小的向量以生成浅拷贝。但是,通过使用

您可以更轻松地执行此操作,代码的格式非常奇怪。出了什么问题?@RainerJoswig这是我的第一篇帖子,我很抱歉。你的代码格式非常奇怪。出了什么问题?@RainerJoswig这是我的第一篇帖子,我很抱歉。向量和列表有什么区别?@naomik向量在其他语言中通常称为数组,通常是固定长度的O(1)访问,而列表是单链接列表。常见的Lisp既有向量也有数组,不同之处在于数组可以是动态大小和多维的。@Sylvester我使用了(vector copy vec)而不是(vector vec),效果非常好!我现在得到了我想要的解决方案。非常感谢!向量和列表有什么区别?@naomik向量在其他语言中通常称为数组,通常是固定长度的O(1)访问,而列表是单链接列表。常见的Lisp既有向量也有数组,不同之处在于数组可以是动态大小和多维的。@Sylvester我使用了(vector copy vec)而不是(vector vec),效果非常好!我现在得到了我想要的解决方案。非常感谢!