如何测试Scheme中引用符号的相等性?

时间:2011-06-13 09:05:22

标签: comparison scheme equality

在此示例中,

> (= 1 1)
#t
> (= 'a 'a)
*** ERROR IN (console)@2.1 -- (Argument 1) NUMBER expected
(= 'a 'a)
1> 

如何测试带引号的符号的相等性?

2 个答案:

答案 0 :(得分:8)

您使用eq?eqv?equal?中的任何一个。

这三个都可以与任何对象一起使用而不会出错(与=不同,eqv?只能与数字一起使用)。但是,结果会根据您传入的类型而有所不同。但如果您知道自己正在比较符号,则所有符号都将具有相同的结果。

如果您已完成任何Java编程,==就像equal?,而.equals()就像eqv?。简单来说,equal?进行身份比较,eq?进行值比较。

(并且eqv?执行直接指针比较。对于某些实现,它可能比eqv?更快,理解它有时对于相等的数字或字符返回false。对于其他实现,它与eqv?完全相同。大多数情况下,为了健壮,你应该坚持使用eq?进行身份比较,并忘记{{1}}存在。)

答案 1 :(得分:0)

来自计划文档https://www.gnu.org/software/guile/manual/html_node/Equality.html

eq?仅针对同一对象进行测试(本质上是指针比较)。这是快速的,可以在搜索特定对象或使用符号或关键字(它们始终是唯一的对象)时使用。

eqv?扩展了eq?以查看数字和字符的值。例如,它可以像=(请参阅Comparison)那样使用,但如果一个操作数不是数字,则不会出错。

equal?更进一步,它(递归地)查看列表,向量等的内容。例如,在已经在不同位置读取或计算且相同但未创建的列表上,这很好同一对。这样的列表看起来一样(打印时),并且相等吗?会认为它们相同。

相关问题