0

n 次元のベクトルにアクセスしたいのですが、どういうわけか (empty?'()) が 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)))
4

1 に答える 1

2

ほとんどの場合、その 1 行は次のようになります。

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

「適用」がなければ、alist空になることはありません。理由は次のとおりです。

パラメータの定義には、オプションaccess-ndalistパラメータ リストがあります。通常の定位置パラメーターとはドットで区切られています。この手段access-ndは、1-n パラメータで呼び出すことができます。最初のパラメータ以降のすべてのパラメータがリストに収集され、 にバインドされalistます。たとえば、次のような呼び出し

(access-nd v 1 2 3) 

alistリストにバインドされます(1 2 3)。同様に、元のコードで次の呼び出しを行います。

(access-nd avector (rest alist))

alist1 つの要素を持つリストにバインドされます。そのためalist、空になることはありません。

一方、 Scheme のapplyは、引数のリストを最後のパラメーターとして取り、通常の方法で渡されたかのように関数を呼び出します。

于 2009-06-10T18:02:49.307 に答える