私は、Scheme におけるベクトルの基本的な実装を知らないので、vector-append!
プロトタイプ:
(define (vector-append! vect . vects)
; definition here
)
vector-ref
PSは一定時間の操作であるため、リストよりもベクトルを使用することをお勧めします[src]
私は、Scheme におけるベクトルの基本的な実装を知らないので、vector-append!
プロトタイプ:
(define (vector-append! vect . vects)
; definition here
)
vector-ref
PSは一定時間の操作であるため、リストよりもベクトルを使用することをお勧めします[src]
作成後にベクターのサイズを変更することはできvector-append!
ないため、インプレース操作として実装することはできません。あなたができることは、すべてのサブベクトルの要素が次々にコピーされる、すべてのサブベクトルのサイズの合計に等しいサイズの新しいベクトルを作成することです。
vector-grow
開始手順として使用し、そこから作業します。実用的なソリューションを得るには、インデックスを少し操作する必要があります。
ベクトルはサイズ変更できません。したがって、vector-append!
ベクトルのサイズを拡張する a は不可能です。
通常は「!」は、Scheme での破壊的な操作を意味します。破壊的な実装が必要だと明確に述べていません。私はあなたに両方をあげます。最初の非破壊バージョンは、単純に次のとおりです。
(define (vector-append! vect . vects)
(list->vector (apply append (map vector->list (cons vect vects)))))
変更可能なものについては、Scheme ベクトルは長さが不変であるため、独自のベクトル抽象化が必要になります。気を散らさないでください。あなたがそれを必要とするなら、あなたはそれを必要とします。
(define (my-vector . values)
(cons 'MY-VECTOR (list->vector values)))
(define my-vector-values cdr) ; private
(define (my-vector-ref vect index)
(vector-ref (my-vector-values vect) index))
(define (my-vector-append! vect . vects)
(set-cdr! vect (apply vector-append! (map my-vector-values (cons vect vects)))))
そして、新しい抽象化のためのいくつかのヘルパー:
(define (list->my-vector list)
(cons 'MY-VECTOR (list->vector list)))
(define (vector->my-vector vector)
(cons 'MY-VECTOR vector) ; maybe
;; etc
これが私の実装です。申し訳ありませんが、関数を書いたときではなく、今からのコメントです。
また、ベクトルは固定長であるため、ベクトルを直接変更できるとは思わないでください。
(define (vector-append . rest)
(letrec
((all-vectors?
(lambda (vector . rest)
(and (vector? vector)
(or (null? rest)
(apply all-vectors? rest)))))
(++ (lambda (x) (+ x 1)))
(gobble-next
(lambda (big-i small-i vec-big vec-small)
(if (= small-i
(vector-length vec-small))
'gobbled
(begin
(vector-set! vec-big big-i (vector-ref vec-small small-i))
(gobble-next (++ big-i) (++ small-i) vec-big vec-small)))))
(helper
(lambda (i vector . rest) ;;the i here keeps track of the place in the new-vec
(if (null? rest) ;;to start copying at
(begin
(gobble-next i 0 new-vec vector)
new-vec)
(begin
(gobble-next i 0 new-vec vector)
(apply helper (cons
(+ i (vector-length vector))
rest))))))
(new-vec (make-vector (apply length-of-vectors rest)))) ;;end of letrec
(cond ((null? rest)
(error "error, no arguments to vector-append"))
((not (apply all-vectors? rest)) (error "arguments not all vectors"))
((null? (cdr rest))
(car rest))
(else (apply helper (cons 0 rest))))))
(define length-of-vectors
(lambda (vector . rest)
(+ (vector-length vector)
(if (null? rest)
0
(apply length-of-vectors rest)))))