方案(检查列表、数字和符号的相等性)

Scheme (Checking equality for lists, numbers and symbols)

我是 scheme 的新用户,我正在尝试创建一个能够检查数字、符号和列表(包括嵌套列表)是否相等的函数。我已经尝试了以下代码的多种变体,但未能提出可行的解决方案;主要问题是,在遇到嵌套列表后,如果原始列表中有更多元素,程序将不会继续超过该点,而且我不确定如何使该函数适用于列表和 numbers/symbols。任何帮助表示赞赏。

请注意,我在 Scheme 中使用 R5RS 语言,据我所知这限制了该语言的功能。

(define (my-equal? a b)
  (cond ((null? a))
        ((list? (car a))(my-equal? (car a)(car b)))
        ((equal? (car a)(car b))
         (my-equal? (cdr a)(cdr b)))
        (else #f)))

如果 a 满足 null?,则您不需要 return 任何明确的内容。但正确答案是什么?如果在这种情况下你有 (null? b),则等式成立。

接下来,您假设可以使用 acar 并根据 list? 谓词测试 that 值。实际上,您首先必须检查 a 本身是一个列表,以便允许访问它的第一个元素。

在接下来的所有子句中,您操纵输入的 carcdr,而不是直接使用 ab。 唯一需要使用它们的情况是当您确定 ab 是列表时:那么,如果它们的 car 是平等的,他们的 cdr 也是。

其他情况不能假定值是列表。相反,当 list? 在你的 cond 中失败时,你确定你正在处理另一种输入。您不能在以下行中调用 (car a) 而不会出现错误。

然后,如果 ab 都是数字,字符串或其他类型,则必须提供其他比较方法。

我不确定这是否是 "I just want to implement it myself" 类型的问题,但在 R5RS 标准中,equal? 的文档指出:

等于?递归地比较对、向量和字符串的内容,应用 eqv?在其他对象上,例如数字和符号。一个经验法则是对象通常是相等的?如果他们打印相同。平等的?如果其参数是循环数据结构,则可能无法终止。

所以... equal? 已经处理了嵌套列表、向量等的递归检查

同样,如果您只是对如何实现这样的东西感兴趣,那么不要让我阻止您!