eq如何?在球拍中使用符号和数字吗?

问题描述 投票:0回答:2

球拍文件告诉我“如果eq?#t指向同一个对象,v1返回v2”,但根据fixnums,两个=eq?也相同,[ C0]“如果所有参数在数值上相等,则返回=”。我找不到关于“数字”和“符号”的任何消息,但是在示例中,我发现了:

#t

与上述矛盾,因为上面从未提到过> (eq? 'yes 'yes) #t 是特殊的,因此symbol'yes不相同。

这个让我更加困惑:

'yes

如果对数字进行数字测试,则> (eq? (expt 2 100) (expt 2 100)) #f > (eq? (* 6 7) 42) #t 应该返回(eq? (expt 2 100) (expt 2 100)),否则,通过引用测试数字,然后#t应该返回(eq? (* 6 7) 42),所以我想以上两种情况都不对...

为什么?!

racket
2个回答
2
投票
#f

太大,无法成为(expt 2 100) 。让我们尝试评估:

fixnum

这是因为在多个存储单元中分配了大量数字(将它们视为数字组的列表)。

另一方面,每个符号在读取时都是“内部化的”。这意味着第一次读取它时,会为其创建一个新的符号值。随后,当再次读取它时,系统将检查是否已经存在具有该名称的符号,在这种情况下,将返回旧的符号值,而不会在内存中创建任何新对象。因此:

(expt 2 100)  ; => 1267650600228229401496703205376
(fixnum? (expt 2 100)) ; => #f
(expt 2 10) ; => 1024
(fixnum? (expt 2 100)) ; => #t

因为显然两个具有相同名称的不同符号实际上是内存中的同一对象。


0
投票

这是除了@Renzo的答案之外的其他信息

我如何检查数据类型是否被“内部化”

答案是很复杂。

一个因素是阅读时间。引用(eq 'yes 'yes) ; => #t

阅读器在https://docs.racket-lang.org/reference/reader.html?q=intern#%28tech._interned%29模式下生成的符号,关键字,字符串,字节字符串,正则表达式,字符和数字为interned,这意味着read-syntax结果中的此类值始终为read-syntax当它们是eq?时(无论是从同一呼叫还是从不同呼叫到equal?)。在read-syntaxread模式下都插入符号和关键字。跨场所通道发送一个中间值不一定在接收场所产生一个中间值。另请参见read-syntaxdatum-intern-literal

因此datum->syntax返回(eq? (expt 2 100) (expt 2 100)),因为需要在运行时计算#f。另一方面,(expt 2 100)返回(eq? 1267650600228229401496703205376 1267650600228229401496703205376),因为该值在读取时很明显,从而允许Racket内插该数字。

另一个因素是数据类型。例如,根据#t

始终固定一个fixnum。

根据等式,两个=的fixnum也相同。否则,等式的结果?应用于两个数字是不确定的,

© www.soinside.com 2019 - 2024. All rights reserved.