Tôi tự hỏi nếu tôi thiếu một cái gì đó cơ bản liên quan đến thao tác vector. Hãy nói rằng tôi có như sau:Làm cách nào để sửa đổi một phần của vectơ trong Clojure?
(def xs [9 10 11 12 13])
(def idx [0 2])
(def values [1 3])
Nếu tôi muốn trở về vector [1 10 3 12 13]
trong Matlab, tôi sẽ viết xs(idx) = values
. Trong Clojure, có một cách nguyên thủy để đạt được điều này? Hiện tại, tôi đang sử dụng chức năng sau:
(defn xinto [seq idx val]
(apply assoc seq (interleave idx val)))
Cảm ơn.
Tôi không thể cung cấp mã nào ngoài các đề xuất đã cho. 'assoc' _is_ nguyên thủy thích hợp nhưng nó muốn các chỉ mục và các giá trị được truyền riêng lẻ như bạn đã thấy. Bạn có thể xây dựng một chuỗi các cặp giá trị chỉ mục như bạn làm và sử dụng 'apply' hoặc đệ quy làm assoc bằng cách sử dụng' reduce' như được gợi ý bởi amalloy và mikera. Theo mặc định, phiên bản multi-value của assoc vẫn được đệ quy. Tôi sẽ xem xét các tùy chọn 'reduce' thành ngữ hơn. –
Tôi nghĩ giải pháp của bạn là khá tốt nhất. –
'áp dụng assoc' và' xen kẽ' có lẽ là lựa chọn tốt nhất khi tất cả những gì bạn muốn làm là đặt cụ thể chỉ mục mà không quan tâm đến giá trị trước đó của nó. Hầu hết thời gian tôi nghi ngờ bạn sẽ muốn làm một cái gì đó phức tạp hơn, và sau đó "lừa" này sẽ không làm việc ở tất cả; đó là lý do tại sao tôi đề nghị sử dụng 'reduce', tổng quát hơn. – amalloy