Я пытаюсь получить доступ к N-мерному вектору, но попадаю в бесконечную рекурсию.

StackOverflow https://stackoverflow.com/questions/977201

  •  13-09-2019
  •  | 
  •  

Вопрос

Я хочу получить доступ к 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, с другой стороны, принимает список аргументов в качестве последнего параметра и вызывает функцию, как если бы они были переданы ей обычным способом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top