即使我有空列表的后备,为什么仍返回错误“无法读取未定义[]的属性'car”的错误?

时间:2019-05-29 03:26:56

标签: syntax-error scheme lisp

我正在尝试建立一个过程来比较两个列表(它们是较大列表的元素)并返回它们的相似程度。该过程将通过求和两个列表中同一索引中元素之间的差异来完成此操作。通过比较两个列表的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 个答案:

答案 0 :(得分:4)

您的代码有几个问题。例如:

  • (if (null? arr1))表达式是一个if,没有结果或替代项,因为最右边的)不得在结果和替代项之后在此处关闭。
  • similarity-arrays的递归调用不正确,您传递了错误的参数类型,参数数量也不正确。
  • 与上一个参数有关:在get-listsimilarity-arrays中,有时您都假设参数是 elements ,而其他时候它们是 lists
  • 例如,dust的定义中还有其他带有不平衡括号的部分。使用良好的IDE并适当缩进代码,以向您显示缺少括号的位置
  • 我们应该尽量避免使用length,这是一种通过询问是否为null?来确定是否到达列表末尾的方法。
  • 对于这个问题,您应该使用equal?来测试相等性,而不是eq?
  • 传递两个列表的列表会使迭代更加困难,您是否考虑过传递两个列表?