/ / Co jest nie tak z moim Scheme przy użyciu implementacji wektora? - wektor, schemat, seplenienie, rakieta, normalizacja

Co jest nie tak z moim Scheme przy użyciu implementacji wektora? - wektor, schemat, seplenienie, rakieta, normalizacja

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 № 1

vector 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?