Я пытаюсь получить доступ к N-мерному вектору, но я попадаю в бесконечную рекурсию - PullRequest
0 голосов
/ 10 июня 2009

Я хочу получить доступ к n-мерному вектору, но почему-то (пусто? '()) Продолжает возвращать false.

;; получить доступ к n размерным векторам
;; (access-nd vector a-list-of-numbers) -> элемент
;; (access-nd (вектор (вектор '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 Ответ

2 голосов
/ 10 июня 2009

Скорее всего, одна строка должна выглядеть так:

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

Без «apply» 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 будет привязан к списку с одним элементом. Вот почему alist никогда не будет пустым.

Схема apply, с другой стороны, принимает список аргументов в качестве последнего параметра и вызывает функцию, как если бы они были переданы ей обычным способом.

...