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

时间:2017-03-31 21:14:04

标签: vector scheme lisp racket normalization

我想知道我在这里使用vector-set

做错了什么
(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)))

我试图将向量的每个元素设置为norm(来自另一个谓词的整数)。

我一直得到的错误是

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

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

2 个答案:

答案 0 :(得分:1)

在程序的第二行,您编写(vector vec)。这评价的是什么?

答案 1 :(得分:1)

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

可以更轻松地完成此操作