lisp - 当量值?功能(DrRacket)

标签 lisp scheme racket

DrRacket 中的相等函数非常复杂。它们之间存在细微差别,我无法理解。

您能解释为什么这两个结果不同吗?为什么例如 'a' == 'a',但是 "abc"!= "abc"?

(eqv? (integer->char 955) (integer->char 955))
; => true

(eqv? (number->string 955) (number->string 955))
; => false

最佳答案

虽然这两个“(number->string 955)”看起来一样,但它们在内存中返回了两个不同的对象。考虑到这一点,让我们比较一下:

(eq? (number->string 955) (number->string 955))
#f

这是错误的,因为 eq?关心同一性,即:被比较的事物在内存中是否完全是同一个对象。此检查速度很快,但通常不是您想要的。

(eqv? (number->string 955) (number->string 955))
#f

这又是错误的,原因与 eq? -- 这些不是内存中的相同对象。当量值?然而,数字和字符除外:它将按值比较它们,所以两个数字是 eqv?如果它们具有相同的值。这仍然很快,并且通常是您在进行数字相等性测试时想要的。

(equal? (number->string 955) (number->string 955))
#t

现在这是真的。为什么?对象仍然不同,但相等?对字符串(以及其他数据类型也是如此,但我会保持简单)进行异常(exception)处理。什么时候相等?给定字符串,它会按词法比较字符串:因此,如果它们的长度和字符序列相同,则它们是“相等的”。这是您想要的字符串检查。

关于lisp - 当量值?功能(DrRacket),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19719500/

相关文章:

Emacs 口齿不清 "shell-command-on-region"

terminal - 未绑定(bind)变量 'trace'

racket - redex 术语中取消引用的省略号

方案中结构体的参数

lisp - Racket - 将偶数和奇数整数过滤到两个单独的列表中

emacs - 如何在elisp中使用过滤器执行sudo命令

variables - 理解 Lisp 中变量重新分配的困难

scheme - 如何在文件中记录方案 session ?

scheme - Scheme中的平等

scheme - PLTScheme如何捕获错误?