我试图访问N维向量,但我进入无限递归

时间:2009-06-10 17:56:10

标签: scheme racket

我想访问一个n维向量但不知何故(空?'())一直返回false。

;;访问n维向量
;; (access-nd vector a-list-of-numbers) - >元素
;; (access-nd(vector(vector'x'y)'a'b))0 1) - > x

(define (access-nd avector . alist)
  (cond
    ((and (not(empty? alist)) (vector? avector))
     (vector-ref (access-nd avector (rest alist)) (first alist)))
    (else avector)))

请帮助。

编辑:已修正的代码

(define (access-nd avector . alist)
  (cond
    ((and (not(empty? alist)) (vector? avector))
     (apply access-nd (vector-ref avector  (first alist)) (rest alist)))
    (else avector)))

1 个答案:

答案 0 :(得分:2)

最有可能的是,一行应该是:

     (vector-ref (apply access-nd avector (rest alist)) (first alist)))

如果没有“申请”,alist将永远不会为空。原因如下:

access-nd的定义中,alist参数是可选参数列表;它用正常位置参数的点分隔。这意味着可以使用1-n参数调用access-nd。第一个之后的任何参数都被收集到列表并绑定到alist。例如,像

这样的调用
(access-nd v 1 2 3) 

会导致alist绑定到列表(1 2 3)。同样,您在原始代码中进行此调用:

(access-nd avector (rest alist))

将导致alist绑定到包含一个元素的列表。这就是alist永远不会为空的原因。

另一方面,

Scheme apply将一个参数列表作为最后一个参数,并调用该函数,就像它们以正常方式传递给它一样。