2

我正在为 Gimp script-fu 启动方案,但我找不到从向量中删除项目的简单方法。

我唯一的解决方案是:

  1. 将向量转换为列表
  2. 从列表中删除项目(http://stackoverflow.com/questions/1905222/how-to-delete-an-element-from-a-list-in-scheme)
  3. 将列表转换为向量

这是一种更简单的方法吗?

这是我的代码:

(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)))))))
4

2 回答 2

3

就是这样:您需要创建一个没有需要删除的元素的新向量,复制所有其他向量。但是在您的代码中,您错过了向量中存在元素的情况,您也不需要创建中间列表,直接从向量转到向量。我使用标准方案用 Racket 编写了这个,它应该很容易适应 script-fu:

(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)
于 2012-11-27T12:42:37.180 回答
0

或者通过更直观的方式:

(define (vector-delete v i)
  (vector-append (vector-take v i) (vector-drop v (+ i 1)))) 
于 2015-01-13T10:33:06.710 回答