我正在学习Scheme,我想比较两个变量,但是我不知道每种变量都有哪种类型。
在此SO answer上,告诉何时使用=,eqv ?、等于?和eq ?,但我没有找到我想要的东西。
我的问题是,变量可能是:
'(1 2)
或'((10) 2)
。'sunny
。2
。所以我可以将数字与列表进行比较,或者将列表与字符串进行比较。
我有此代码:
(define contains?
(lambda (lst element)
(cond
[(null? lst) #f]
[(equal? (car lst) element) #t]
(else [(contains? (cdr lst) elements)]))))
我可以使用哪个运算符来比较其中两个变量?
答案 0 :(得分:3)
如果要测试它们的平等,那么equal?
是最好的选择,它是最通用的相等谓词,因此可用于多种数据类型,并进行递归比较对于列表,向量等的情况:
两个值相等吗?且仅当它们是eqv?时,除非为特定数据类型另外指定。
进一步指定是否等于的数据类型?包括字符串,字节字符串,对,可变对,向量,框,哈希表和可检查的结构。在后六种情况下,均等地定义了相等性。如果v1和v2都包含参考周期,则当值的无限展开相等时,它们相等。
答案 1 :(得分:0)
只需添加到奥斯卡奖的答案即可。对于数字,有特定于类型的过程,例如string=?
,char=?
和=
,但一般而言,有3种:
eq?
测试两个参数是否具有相同的值,如在同一时刻创建的参数或指针相等。 eqv?
测试两个原始/标量/原子值在显示时是否看起来相同equal?
测试两个值是否相同此外,保证{{1}的#t
是eq?
的{{1}}和#t
的{{1}}可以保证是eqv?
的{{1}}。
我读过完全跳过#t
的书,只是将eqv?
和#t
用作一般比较。相当多的东西比较程序具有全面的3种比较方法的3种版本。例如。 equal?
(eqv?
),eq?
(equal?
),member
(equal?
)。
关于memv
:我们保证eqv?
,memq
,eq?
和诸如eq?
之类的符号的取值都相同时间,因此它们始终是指针相等的。其他值可能在10亿之间,但您不能保证所有实现都会做到这一点。根据标准和'()
,#t
是正确的。实际上,两个示例可以有任何结果,报告也可以。请注意,如果#f
胜过'test
,我保证您将(eq? 10 10) ; ==> #f
与(eq? '(a) '(a)) ; ==> #t
在一起,但反之则不然。如果某事是#t
,您仍然不知道eqv?
是什么。