gpt4 book ai didi

scheme - eq?在 Racket 中表现与 eq 不同?在 Guile 中还是在 Common Lisp 中是 eq?

转载 作者:行者123 更新时间:2023-12-04 22:34:17 28 4
gpt4 key购买 nike

新年快乐!

我正在努力学习 Racket(我不是经验丰富的 Lisper)。

现在我在 Racket 8.3 中遇到了以下问题:

#lang racket
> (define str1 "hello")
> (define str2 "hello")
> (eq? str1 str2)
#t

我希望#f 喜欢here .在 Guile 和 Common Lisp 中,这被返回。

根据 this我可以重现以下行为符合预期:

> (set! str1 (string #\h #\e #\l #\l #\o))
> (set! str2 (string #\h #\e #\l #\l #\o))
> (eq? str1 str2)
#f

但我不明白原因。

是不是,在 Racket 中只有函数 STRING 返回两个不同的对象,而文字字符串像符号一样是唯一的?因此,当?行为通常但文字字符串的处理方式不同?

你能不能好心给我解释一下?

非常感谢。

最佳答案

eq? 所做的与 Common Lisp 中的 eq 所做的相同:它告诉您两个对象是否是同一对象。

您所看到的是,通常没有定义相似的文字对象实际上是否是同一个对象,使它们相同通常会有好处。一个特别的好处是您以这种方式使用更少的内存。

在 Racket 的情况下,文字字符串显然是这样合并的,至少在某些情况下是这样。 (但并非总是如此:给定以下程序

#lang racket

(define (ts)
(define (getit prompt)
(printf "~S? " prompt)
(read))
(eq? (getit "1")
(getit "2")))

(ts)

然后

$ racket ts.rkt
"1"? "foo"
"2"? "foo"
#f

例如。)

一般来说,你不应该假设相似的文字实际上是否是同一个对象,因为系统可能会也可能不会选择合并它们,并且可能会或可能不会选择这样做任何特殊情况。

举个例子,如果你有一个包含这个函数的文件,在 CL 中

(defun foo ()
(eq "foo" "foo"))

然后你编译那个文件,它只是完全明确地未定义函数返回真还是假:即使 READ 为两个字符串返回不同的对象(我不确定它是否需要做,但它可能是),文件编译器当然被允许合并它们所以只有一个文字字符串(当然因此允许注意到该函数总是返回 true 并简单地将它转换为 (defun foo () t)).

所以答案是:永远不要假设相似的文字是相同的,或者不是相同的:如果你想要相似但不相同的对象,你需要自己用一个定义为 make new 的函数来制作它们对象。

关于scheme - eq?在 Racket 中表现与 eq 不同?在 Guile 中还是在 Common Lisp 中是 eq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70555419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com