2

私はGimpscript-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

それが方法です。削除する必要のある要素なしで新しいベクトルを作成し、他のすべてをコピーする必要があります。しかし、あなたのコードでは、要素がベクトルに存在しない場合を見逃しています。また、中間リストを作成する必要はなく、ベクトルからベクトルに直接移動します。私はこれを標準のSchemeを使用して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 に答える