[英]Scheme (Checking equality for lists, numbers and 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)))
我不确定这是否是“我只想自己实现”的问题,但是在R5RS标准中,文档是否equal?
状态:
等于? 应用eqv递归比较对,向量和字符串的内容? 在其他对象上,例如数字和符号。 根据经验,物体通常是相等的吗? 如果它们打印相同。 等于? 如果其参数为循环数据结构,则可能无法终止。
所以... equal?
已经处理嵌套列表,向量等的递归检查。
再说一次,如果您只是对如何实现这样的东西感兴趣,那就不要让我阻止您!
如果a
满足null?
,您不会明确返回任何内容。 但是正确的答案是什么? 如果在这种情况下,您拥有(null? b)
,则等式成立。
接下来,你认为你可以把car
的a
和测试针对该值list?
谓语。 其实,你首先要检查的是a
本身就是为了一个列表被允许访问的第一个元素。
在接下来的所有子句中,您将操纵输入的car
和cdr
,而不是直接使用a
和b
。 当你需要使用它们的唯一情况是,当你确保两个 a
和b
是列表:那么,他们是平等的,如果他们的car
都是平等的,他们的cdr
太。
其他情况不能假定值是列表。 相反,何时list?
如果cond
失败,则确保您正在处理另一种输入。 您不能在以下行中调用(car a)
,而不会发生错误。
然后,如果a
和b
都是数字,字符串或其他类型,则必须提供其他比较方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.