为什么有这么多方法可以比较平等?

高洛·罗登(Golo Roden)

如果我想比较两个值是否相等,则有很多选择,例如:

  • eq 用于符号
  • = 对于数字
  • char-equal 对于字符
  • string-equal 对于字符串
  • eql 用于符号,数字和字符串
  • equal 除了符号以外的所有东西

(我希望到目前为止我做对了。)

现在,作为Lisp初学者,我的问题是:为什么?这仅仅是出于“历史原因”还是拥有所有这些可能性的真正好处?

我知道为什么-问题总是很难回答,并且可能是基于观点的,但是我认为(猜测)有些最佳实践是Lisp高级开发人员普遍同意的。

马克·卡波夫

实际上,你可以比较的一切eqeqlequalequalp但是自己选择,需要什么:

eq比较指针很容易因此,符号(因为唯一符号只进入包一次,并且每次使用时其地址都相同)将返回true。

CL-USER> (eq 'a 'a)
T

接下来,即使包含相同的值,不同的列表也不相等(以表示eq)。它们具有不同的地址,它们是不同的对象。

CL-USER> (defparameter *a* '(1 2))
*A*
CL-USER> (defparameter *b* '(1 2))
*B*
CL-USER> (eq *a* *b*)
NIL

但这并不总是正确的,例如,如果您要处理文字对象:

CL-USER> (lambda nil '(1 2 3))
#<FUNCTION :LAMBDA NIL '(1 2 3)>
CL-USER> (eq * *)
T

而:

CL-USER> (eq '(1 2 3) '(1 2 3))
NIL

棘手的?您可能期望包含相同数字的不同变量的值将不相等,因为数字应该占用不同的内存块,但是...

CL-USER> (defparameter *c* 5)
*C*
CL-USER> (defparameter *d* 5)
*D*
CL-USER> (eq *c* *d*)
T

eq功能描述说的是相同的对象,所以数字5在任何地方都是相同的对象。

接下来,eql在上定义函数eq,它将t在以下情况下求值

  • 如果x和y是eq
  • 如果x和y都是相同类型和相同值的数字。
  • 如果它们都是代表相同字符的两个字符。

而且equalequalp处理“视觉上类似的”对象。

为什么这么多?自己想想:在LISP之类的语言中,您不能显式地使用指针,因此您可能希望在列表或任何地方找到完全相同的对象(在相同的地址)。因此,您需要在此“指针”级别起作用的函数。接下来很明显,您需要“正常”的比较功能,这就是它们的所在。差异是微妙的并且有些历史性,但是将它们全部都有用。

同样重要的是要注意,这4个基本比较函数中的某些函数还具有其他含义,可应用于某些类型的数据。例如equal,以区分大小写的方式比较字符串,而equalp以不区分大小写的方式比较

CL-USER> (equal "My String" "My String")
T
CL-USER> (equal "My String" "My string")
NIL
CL-USER> (equalp "My String" "My string")
T

为了继续进行字符串示例,这里有许多类似的函数string=,为什么?那就是《 The Lisp Common Cook》的意思:

如果要部署实现定义的字符属性,则需要使用它们在这种情况下,请检查供应商的文档。

但是,在大多数情况下,这四个基本功能就足够了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么/ dev中有这么多设备?

来自分类Dev

为什么“ git index”有这么多名称?

来自分类Dev

为什么会有这么多的符号链接?

来自分类Dev

为什么/ dev中有这么多设备?

来自分类Dev

为什么会有这么多sidekiq进程?

来自分类Dev

ActionCable:为什么有这么多连接?

来自分类Dev

为什么有这么多python版本在使用?

来自分类Dev

为什么有这么多种测量磁盘使用率的方法?

来自分类Dev

为什么在java中有这么多获取日期时间的方法?

来自分类Dev

当我有这么多RAM时,为什么我的系统这么慢?

来自分类Dev

HTTP / 2的协议ID是什么,为什么有这么多?

来自分类Dev

为什么在ASP.NET Identity的“ UserStore”中有这么多存储库?

来自分类Dev

为什么在“钥匙串”的“私钥”部分中有这么多的iMessage签名密钥?

来自分类Dev

为什么在modules.dep中有这么多条目?

来自分类Dev

为什么在基础图像上有这么多图层?码头工人

来自分类Dev

为什么罗斯林中有这么多的对象池实现?

来自分类Dev

为什么<h3>和<p>之间有这么多空间

来自分类Dev

基本的npm + Webpack:为什么会有这么多模块?

来自分类Dev

为什么我会有这么多滞后?

来自分类Dev

为什么Chrome在我的计算机上有这么多进程?

来自分类Dev

为什么在此PowerShell脚本中有这么多StringConstantExpressionAst?

来自分类Dev

为什么我有这么多REPOSITORY name = <none>的Docker映像?

来自分类Dev

为什么Linux中有这么多/ dev / tty?

来自分类Dev

SATA电源连接器上为什么有这么多的针脚?

来自分类Dev

为什么会有这么多虚拟终端设备?

来自分类Dev

为什么本地IP地址有这么多格式?

来自分类Dev

为什么会有这么多不同的Visual C ++可再发行文件?

来自分类Dev

为什么我有这么多ngen.exe进程?

来自分类Dev

在UITableView中使用“自动布局”,为什么周围有这么多额外的空间?

Related 相关文章

  1. 1

    为什么/ dev中有这么多设备?

  2. 2

    为什么“ git index”有这么多名称?

  3. 3

    为什么会有这么多的符号链接?

  4. 4

    为什么/ dev中有这么多设备?

  5. 5

    为什么会有这么多sidekiq进程?

  6. 6

    ActionCable:为什么有这么多连接?

  7. 7

    为什么有这么多python版本在使用?

  8. 8

    为什么有这么多种测量磁盘使用率的方法?

  9. 9

    为什么在java中有这么多获取日期时间的方法?

  10. 10

    当我有这么多RAM时,为什么我的系统这么慢?

  11. 11

    HTTP / 2的协议ID是什么,为什么有这么多?

  12. 12

    为什么在ASP.NET Identity的“ UserStore”中有这么多存储库?

  13. 13

    为什么在“钥匙串”的“私钥”部分中有这么多的iMessage签名密钥?

  14. 14

    为什么在modules.dep中有这么多条目?

  15. 15

    为什么在基础图像上有这么多图层?码头工人

  16. 16

    为什么罗斯林中有这么多的对象池实现?

  17. 17

    为什么<h3>和<p>之间有这么多空间

  18. 18

    基本的npm + Webpack:为什么会有这么多模块?

  19. 19

    为什么我会有这么多滞后?

  20. 20

    为什么Chrome在我的计算机上有这么多进程?

  21. 21

    为什么在此PowerShell脚本中有这么多StringConstantExpressionAst?

  22. 22

    为什么我有这么多REPOSITORY name = <none>的Docker映像?

  23. 23

    为什么Linux中有这么多/ dev / tty?

  24. 24

    SATA电源连接器上为什么有这么多的针脚?

  25. 25

    为什么会有这么多虚拟终端设备?

  26. 26

    为什么本地IP地址有这么多格式?

  27. 27

    为什么会有这么多不同的Visual C ++可再发行文件?

  28. 28

    为什么我有这么多ngen.exe进程?

  29. 29

    在UITableView中使用“自动布局”,为什么周围有这么多额外的空间?

热门标签

归档