Vector 方案:如何从向量中删除/删除元素

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

我正在启动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 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))))