Я пытаюсь получить доступ к N-мерному вектору, но попадаю в бесконечную рекурсию.
Вопрос
Я хочу получить доступ к n-мерному вектору, но каким-то образом (пусто?'()) продолжает возвращать false.
;;доступ к n-мерным векторам
;;(вектор доступа-список-номеров) -> элемент
;;(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)))
Решение
Скорее всего, эта строка должна гласить:
(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
быть привязанным к списку с одним элементом.Вот почему alist
никогда не будет пустым.
Схема apply
, с другой стороны, принимает список аргументов в качестве последнего параметра и вызывает функцию, как если бы они были переданы ей обычным способом.