私はn次元ベクトルにアクセスしようとしていますが、私は無限の再帰に入ります
質問
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つの行が読み取る必要があります:
(vector-ref (apply access-nd avector (rest alist)) (first alist)))
「適用」なしで、 alist
決して空になることはありません。その理由は次のとおりです。
の定義で access-nd
alist
パラメーターはオプションのパラメーターリストです。通常の位置パラメーターからドットで分離されています。これの意味は access-nd
1-nパラメーターで呼び出すことができます。最初のパラメーターの後の任意のパラメーターはリストに収集され、 alist
. 。たとえば、次のように呼び出します
(access-nd v 1 2 3)
原因になります alist
リストにバインドされます (1 2 3)
. 。同様に、元のコードでのこの呼び出し:
(access-nd avector (rest alist))
原因になります alist
1つの要素を持つリストにバインドされます。それが理由です alist
決して空になることはありません。
スキーム apply
, 一方、引数のリストを最後のパラメーターとして撮影し、通常の方法で渡されたかのように関数を呼び出します。
所属していません StackOverflow