私はここでベクトルセットで何が間違っているのだろうと思っていました
(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は1vector
引数として指定された要素を使用して可変ベクトルを作成します。したがって、
(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)
。これは何に評価されますか?