Zastanawiam się, co robię źle tutaj z zestawem wektorowym
(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)))
Próbuję ustawić każdy element wektora, który ma być podzielony przez normę (liczbę całkowitą z innego predykatu).
Błąd, który ciągle dostaję
vector-set!: index is out of range
index: 1
valid range: [0, 0]
vector: "#(3/4)
Więc znajduję pierwsze rozwiązanie, jednak newvec
zostaje zresetowany do rozmiaru 1, więc indeks wychodzi poza zasięg.
Odpowiedzi:
1 dla odpowiedzi № 1vector
tworzy zmienny wektor z elementami podanymi jako argumenty, czyli:
(vector 4) ; a vector of one element
(vector 1 2 3) ; a vector of 3 elements
SO pozwala powiedzieć, że potrzebujesz wektora 20 elementów, który zamierzasz zmutować i pracować. Za pomocą vector
nie wchodzi w grę, ponieważ wtedy musiałbyś mieć 20 fałszywych argumentów. Zamiast tego używasz make-vector
Wymaga dwóch argumentów, rozmiaru i opcjonalnej wartości początkowej dla wszystkich elementów:
(make-vector 20 0)
; ==> #(0 0 ... 0), a vector of 20 elements, all 0
Teraz ze świadomością, że możesz uzyskać długość przekazywanego wektora vector-length
możesz to przekazać make-vector
zrobić wektor o tym samym rozmiarze, który można skopiować wartości, aby zrobić płytką kopię. Jednak można to zrobić znacznie łatwiej przy użyciu vector-copy
1 dla odpowiedzi nr 2
W drugim wierszu programu piszesz (vector vec)
. Do czego to służy?