Vector 方案:如何从向量中删除/删除元素
我正在启动Gimp脚本fu的方案,但我没有找到从向量中删除项的简单方法 我唯一的解决办法是:Vector 方案:如何从向量中删除/删除元素,vector,scheme,gimp,script-fu,Vector,Scheme,Gimp,Script Fu,我正在启动Gimp脚本fu的方案,但我没有找到从向量中删除项的简单方法 我唯一的解决办法是: 将向量转换为列表 从列表中删除项目(http://stackoverflow.com/questions/1905222/how-to-delete-an-element-from-a-list-in-scheme) 将列表转换为向量 这是一种更简单的方法吗 这是我的密码: (set! myvector (list->vector (delete item (vector->list myv
(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)))))))
这就是方法:您需要创建一个新的向量,而不需要删除元素,复制所有其他元素。但是在您的代码中,缺少了向量中不存在元素的情况,也不需要创建中间列表,直接从一个向量到另一个向量。我用球拍用标准方案写了这篇文章,应该很容易适应剧本:
(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 (vector-delete v i)
(vector-append (vector-take v i) (vector-drop v (+ i 1))))
好的,所以每次我都要重新创建一个全新的向量。。。为什么不呢?感谢您的代码,它在Gimp中无需修改即可完美工作:-)
(define (vector-delete v i)
(vector-append (vector-take v i) (vector-drop v (+ i 1))))