/ /ベクトルセットの実装を使用する私のSchemeの何が問題になっていますか? -ベクトル、スキーム、Lisp、ラケット、正規化

ベクトルセットの実装を使用している私のスキームで何が問題になっていますか? - ベクトル、スキーム、リスプ、ラケット、正規化

私はここでベクトルセットで何が間違っているのだろうと思っていました

(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にリセットされるため、インデックスは範囲外になります。

回答:

回答№1は1

vector 引数として指定された要素を使用して可変ベクトルを作成します。したがって、

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

SOでは、20の要素のベクターが必要で、それを突然変異させて操作する必要があるとしましょう。を使用して vector それはあなたが20の仮引数を持たなければならないので、問題外です。代わりに使用します make-vector すべての要素のサイズとオプションの初期値の2つの引数を取ります。

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

これで、渡されたベクトルの長さを次のように取得できることがわかりました。 vector-length あなたはそれを渡すことができます make-vector 値をコピーして浅いコピーを作成できる同じサイズのベクトルを作成します。ただし、次のコマンドを使用すると、はるかに簡単に実行できます。 vector-copy


回答№2の場合は1

プログラムの2行目に、次のように記述します (vector vec)。これは何に評価されますか?