我正在为Gimp script-fu启动方案,我找不到从向量中删除项目的简单方法。
我唯一的解决方案是:
这是一种更简单的方式吗?
这是我的代码:
(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)))))))
答案 0 :(得分:3)
就是这样:你需要创建一个没有需要删除的元素的新向量,复制所有其他元素。但是在你的代码中,你错过了向量中存在元素而不是的情况,你也不需要创建一个中间列表,直接从向量到向量。我用Racket使用标准Scheme编写了这个,它应该很容易适应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)
答案 1 :(得分:0)
或者通过更直观的方式:
(define (vector-delete v i)
(vector-append (vector-take v i) (vector-drop v (+ i 1))))