比较 eq? eqv? 和 equal?

By guenchi at 2018-02-06 • 0人收藏 • 218人看过

Eq Eqv Equal

区别

  • eq? is useful for fast identity (same object) comparisons of non-numbers,

  • = performs numeric comparisons on numbers,

  • eqv? is like eq?, but treats copies of the same number as though they were the same object, and

  • equal? performs a "deep" comparison of the structure of data structures. (It uses eqv? for components that are numbers.)

抄来的。我懒得翻译了。一句话:

eq? 只有在两个参数指向同一个对象时才为 #t. 它跟 eqv? 的区别 只能在不同的 Scheme 实现里体现出来。

不同 implementation 的比较

下面是测试结果:

Scheme48

Scheme48 里,我发现的 eq? 和 eqv? 唯一的不同点,只有这个:

(define a 10.#)
(eq? 10.# a)
; #f
(eqv? 10.# a)
; #t

MzScheme.

MzScheme 里测试,eq? 和 eqv? 区别很多:

(eq? 4# 4##)
(eq? 4.# 4.#)
(eq? "abc" "abc")
(eq? '(1 2) '(1 2))
(eq? "" "")
(eq? 1234567890 1234567890)

都给出 #f. 而这些在 Scheme 48 里都是 #t.

结论

Scheme 48 大部分 eq? 都跟 eqv? 的结果一样。说明 Scheme 48 采 用了大量共享数据结构。这种共享特性还体现在 Scheme 48 的模块 名称中,请参考 ModuleExperiment.

eq? 的特殊用途

eq? 可以判断两个变量是不是指向同一个对象。这样有很多用处。

  • 定义独一无二的对象。eq? 用于比较两个变量是否指向同一个对象。 所以如果你的程序里需要一个独一无二的对象用来表示某种东西, 就可以把它定义为一个 list, 这个 list 里面只有一个 symbol, 就是它自己。这种独一无二的对象有什么好处?举一个例子:

比如 tex2page 里定义了一个对象 *invisible-space*:

(define *invisible-space* (list '*invisible-space*))

以后遇到一个对象,就用一个函数 invisible-space? 函数来判断它 是否是我们这个独一无二的对象:

(define invisible-space?
  (lambda (x)
    (eq? x *invisible-space*)))

*invisible-space* 是用来在输入的 stream 中 表示一个 TeX 命令的开始(大概是这样吧),如果我们使用任何一个 字符,比如 *, &, 甚至那些不可打印的字符,来表示这个“开始”, 那么万一输入文档中真的出现了这个符号呢?我们就会出现很多错误 的命令开始。

所以,用这种“独一无二”的对象,可以避免出现这种问题。


登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...