Почему возвращается ошибка «Невозможно прочитать свойство« автомобиль »из undefined []», хотя у меня есть запасной вариант для пустых списков? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь построить процедуру для сравнения двух списков (которые являются элементами большего списка) и возврата, насколько они похожи. Процедура сделает это путем суммирования разницы между элементами в одном и том же индексе в обоих списках. Это делается рекурсивно путем сравнения car обоих списков, повторного вызова самого себя с результатом выполнения, являющимся сравнением, и новых списков, являющихся cdr обоих списков, и, наконец, возвращением результата, когда оба списка пусты. Однако, когда я проверяю это, возвращается следующая ошибка, хотя у меня есть оператор if для возврата результата, когда списки равны нулю:

Невозможно прочитать свойство 'car' из неопределенного []

Я вполне уверен, что мой синтаксис let правильный, так как он был исправлен в предыдущем вопросе, и единственный другой раз, когда car используется в другой используемой процедуре, не имеет ошибок при запуске сам. Что происходит и как это можно исправить?

Код:

(define (get-list name arr)
  (if (eq? name (car (car arr)))
      (cdr (car arr))
      (get-list name (cdr arr))))
(define (similarity-arrays name1 name2 arrs result)
  (let ((arr1 (get-list name1 arrs))
        (arr2 (get-list name2 arrs)))
    (if (= (length arr1)(length arr2))
        (let ((x1 (car arr1))
              (x2 (car arr2)))
          (if (null? arr1))
              result
              (similarity-arrays
               (cdr arr1)
               (cdr arr2)
               (+ result (- x1 x2)))))
        #f))
(define dust
  (list (list 'akko 11 3 7 5 4 1 9 8 10 6 2)
        (list 'Jodast 10 7 4 6 5 1 11 9 8 3 2)

(similarity-arrays 'Jodast 'Akko dust 0)

1 Ответ

4 голосов
/ 29 мая 2019

Есть несколько проблем с вашим кодом.Например:

  • Выражение (if (null? arr1)) является if без последовательных или альтернативных, поскольку крайний правый ) не должен быть закрыт там, только после последовательного и альтернативного.
  • Неверный рекурсивный вызов similarity-arrays, вы передаете неверный тип параметров и число параметров также неверно.
  • Относительно предыдущего: как в get-list, так и similarity-arrays иногда вы предполагаете, что параметры являются элементами , а иногда - списками
  • Существуют другие части с несбалансированными скобками, например, в определенииdust.Используйте хорошую IDE и правильно сделайте отступ в коде, чтобы показать вам, где отсутствуют скобки
  • Мы должны стараться избегать использования length, способа узнать, достигли ли мы конца списка, если поспрашивая, что это null?.
  • Для этой проблемы вы должны использовать equal? для проверки равенства, а не eq?.
  • Передача списка из двух списков усложняет итерацию, рассмотрели ли вывместо того чтобы передать два списка?
...