2009-06-10 1 views
0

n次元のベクトルにアクセスしたいのですが、どういうわけか(空白? '())がfalseを返し続けます。N次元のベクトルにアクセスしようとしていますが、無限の再帰に陥る

;; n個の次元のベクトルにアクセスする。
;; (access-ndベクトルaリストの番号) - >要素
;; (access-nd(ベクトル(ベクトル 'x' y) 'a' b))0 1) - > x

お願いします。

編集:修正されたコード

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

答えて

2

一行が読むべきことを、ほとんどの場合:

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

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

access-ndの定義では、alistパラメータはオプションのパラメータリストです。それは通常の位置パラメータからドットで区切られています。つまり、は1-nパラメータで呼び出すことができます。最初のパラメータの後のパラメータはすべてリストに集められ、alistにバインドされます。例えば、

(access-nd v 1 2 3) 

のような呼び出しがalistがリスト(1 2 3)にバインドされます。同様に、元のコードでこのコール:

(access-nd avector (rest alist)) 

alistは一つの要素でリストにバインドされます。そのため、alistは決して空ではありません。

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

+0

それはなぜですか? – unj2

+0

何が起こっているのかを理解するのに十分な詳細があれば、私の返事を編集しました。 –