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

时间:2017-03-19 22:46:52

标签: 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将其解释为过程而不是返回值。 我已经尝试了不同的方法来解决这个问题,但我总是得到类似的结果。

任何反馈意见。谢谢!

2 个答案:

答案 0 :(得分:0)

使用srfi 43中的vector-append。

答案 1 :(得分:0)

好吧,所以我仍然不确定我的第一次实现到底出了什么问题,但是将我的名字放入两个辅助方法中似乎有效:

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