2012-11-27 121 views
2

我開始爲Gimp script-fu制定方案,但我沒有找到從矢量中刪除項目的簡單方法。方案:如何刪除/刪除矢量中的元素

我唯一的解決辦法是:

  1. 轉換載體,從列表(http://stackoverflow.com/questions/1905222/how-to-delete-an-element列出
  2. 刪除項目 - 從-A-列表中的方案)
  3. 轉換列表矢量

它是一個simplier方式?

這裏是我的代碼:

(set! myvector (list->vector (delete item (vector->list myvector)))) 

(define delete 
    (lambda (item list) 
    (cond 
    ((equal? item (car list)) (cdr list)) 
    (else (cons (car list) (delete item (cdr list))))))) 

回答

3

就是這樣:你需要在沒有需要被刪除,複製所有其他元素,以創建一個新的載體。但是在你的代碼中,你錯過了向量中存在元素而不是的情況,也不需要創建中間列表,直接從向量轉到向量。

(define (vector-delete vec elt) 
    (let ((new-vec (if (> (vector-length vec) 0) 
        (make-vector (- (vector-length vec) 1)) 
        (vector)))) 
    (define (loop i j) 
     (cond ((= i (vector-length vec)) 
      new-vec) 
      ((equal? (vector-ref vec i) elt) 
      (loop (+ i 1) j)) 
      ((< j (vector-length new-vec)) 
      (vector-set! new-vec j (vector-ref vec i)) 
      (loop (+ i 1) (+ j 1))) 
      (else vec))) 
    (loop 0 0))) 

使用方法如下:我使用標準的方案,它應該很容易爲腳本福適應寫了這個球拍

(define myvector #(1 2 3)) 
(set! myvector (vector-delete myvector 3)) 
myvector 
=> '#(1 2) 
+1

好的,所以我每次都要重新創建一個全新的矢量......爲什麼不呢。感謝您的代碼,它完美的工作,無需修改GIMP :-) – Alex

0

或者通過更直觀的方式:

(define (vector-delete v i) 
    (vector-append (vector-take v i) (vector-drop v (+ i 1))))