基本上,我想做的应该是这样的:
(list->vector (append (vector->list v) lst))
不使用list->vector
、vector->list
或append
。我目前的实现如下:
(let* ([vlen (vector-length v)] [len (+ vlen [length lst])] [new-vec (make-vector len)])
(let loop ([i 0]) (
(cond [(= i len) new-vec]
[(>= i vlen)
(vector-set! new-vec i [list-ref lst [- i vlen]])
(loop [add1 i])]
[else
(vector-set! new-vec i [vector-ref v i])
(loop [add1 i])]))))
不过我遇到了这个异常:
Exception: attempt to apply non-procedure #(*newvector*)
Type (debug) to enter the debugger.
newvector 这里是新向量中的一组值,应该在列表"追加"到向量后返回。
我很确定我收到此异常的原因是因为我的循环实际上是递归的,并试图将新向量返回到堆栈中,因此这最终发生在创建新向量后的某个地方:
......
(vector-set! new-vec i [....])
(#(*newvector*))]
......
因此,Scheme 将其解释为过程而不是返回值。我尝试了不同的方法来解决这个问题,但我总是得到类似的结果。
任何反馈表示赞赏。谢谢!
使用 srfi 43 中的 vector-append。
好的,所以我仍然不确定我的第一个实现到底出了什么问题,但是将我的命名 let 分成两个辅助方法似乎有效:
(define (vector-append-list v lst)
;(list->vector (append (vector->list v) lst))
(let* ([vlen (vector-length v)] [len (+ vlen [length lst])] [new-vec (make-vector len)])
[copy-from-vec v new-vec]
[copy-from-list lst new-vec [vector-length v]]
)
)
(define (copy-from-vec v nv)
(if (zero? [vector-length v])
nv
(let loop ([i 0])
(vector-set! nv i [vector-ref v i])
(if (= (add1 i) [vector-length v])
nv
[loop (add1 i)]))
))
(define (copy-from-list lst nv vlen)
(if (zero? [length lst])
nv
(let loop ([i 0])
(vector-set! nv [+ i vlen] [list-ref lst i])
(if (= (add1 i) [length lst])
nv
[loop (add1 i)]))
))