2012-11-27 94 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))))