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