给定一个列表和一个向量,创建一个新向量,其中给定的向量附加到列表中,而不使用列表>向量或向量>列表

  • 本文关键字:向量 列表 一个 新向量 创建 scheme
  • 更新时间 :
  • 英文 :


基本上,我想做的应该是这样的:

(list->vector (append (vector->list v) lst))

不使用list->vectorvector->listappend。我目前的实现如下:

(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)]))
))

最新更新