当前位置:  开发笔记 > 编程语言 > 正文

什么是在函数列表中查找元素的Scheme函数?

如何解决《什么是在函数列表中查找元素的Scheme函数?》经验,为你挑选了1个好方法。

我有一个元素列表'(abc),我想找到x是否(真或假)x,例如,x可以是'a或'd.这有内置功能吗?



1> Brian Campbe..:

如果你需要使用内建之一等价运营商进行比较,就可以使用memq,memvmember取决于你是否想用找平等eq?,eqv?或者equal?分别.

> (memq 'a '(a b c))
'(a b c)
> (memq 'b '(a b c))
'(b c)
> (memq 'x '(a b c))
#f

如您所见,如果找到一个元素,这些函数将从第一个匹配元素开始返回子列表.这是因为如果您正在搜索可能包含布尔值的列表,您需要能够区分找到a #f的情况和未找到您要查找的元素的情况.列表是一个真正的价值(在方案的唯一错误值#f),所以你可以使用的结果memq,memvmember在任何情况下期待一个布尔值,如if,cond,and,或or表达.

> (if (memq 'a '(a b c))
     "It's there! :)"
     "It's not... :(")
"It's there! :)"

这三种不同功能有什么区别?它基于它们用于比较的等价函数.eq?(并因此memq)测试两个对象是否是相同的底层对象; 它基本上等同于指针比较(或整数情况下的直接值比较).因此,看起来相同的两个字符串或列表可能不是eq?,因为它们存储在存储器中的不同位置.equal?(并因此member?)对列表和字符串进行深度比较,因此基本上任何两个打印相同的项目都将是equal?.除了数字之外几乎所有东西eqv?都是如此 eq?对于数字,两个在数值上等价的数字将始终是eqv?,但它们可能不是eq?(这是因为bignums和有理数,它们可能以不会存在的方式存储eq?)

> (eq? 'a 'a)
#t
> (eq? 'a 'b)
#f
> (eq? (list 'a 'b 'c) (list 'a 'b 'c))
#f
> (equal? (list 'a 'b 'c) (list 'a 'b 'c))
#t
> (eqv? (+ 1/2 1/3) (+ 1/2 1/3))
#t

(请注意,规范未定义函数的某些行为,因此可能因实现而异;我已经包含了可以在任何实现完全有理数的R 5 RS兼容方案中工作的示例)

如果您需要使用不同于内置的等价谓词来搜索列表中的项目,那么您可能需要findfind-tail来自SRFI-1:

> (find-tail? (lambda (x) (> x 3)) '(1 2 3 4 5 6))
'(4 5 6)

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有