【发布时间】:2021-07-03 19:49:14
【问题描述】:
我是 Common Lisp 的新手,尤其是 CLOS。我在一个名为 Nyxt 的包中使用 REPL。
Nyxt 被设计成一个无限扩展的浏览器。因此,用户可以在程序运行时更改代码和/或创建扩展。这是设计的实时可破解性。我的问题与 Nyxt 包无关,但由于它发生在包内,我认为提供更多背景信息会更好。
我不理解函数 find 在这个具体案例中的行为。
我有这个代表 URL 的实例的小列表:
NYXT> small-list
(#<QURI.URI.HTTP:URI-HTTPS https://duckduckgo.com/?q=google+analytics&ia=web>
#<QURI.URI.HTTP:URI-HTTPS https://duckduckgo.com/l/?uddg=https%3A%2F%2Fanalytics.withgoogle.com%2F¬rut=duckduck_in>
#<QURI.URI.HTTP:URI-HTTPS https://en.wikipedia.org/wiki/CAPTCHA>
#<QURI.URI:URI about:blank> #<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
然后,我将列表的第三个元素定义为变量:
NYXT> (defparameter wikipedia-page (third small-list))
WIKIPEDIA-PAGE
NYXT> wikipedia-page
#<QURI.URI.HTTP:URI-HTTPS https://en.wikipedia.org/wiki/CAPTCHA>
好的,如果我尝试在列表中找到维基百科页面,它会按预期工作:
NYXT> (find wikipedia-page small-list :test #'equal)
#<QURI.URI.HTTP:URI-HTTPS https://en.wikipedia.org/wiki/CAPTCHA>
现在,让我将另一个实例绑定到一个变量:
NYXT> (defparameter blog (last small-list))
BLOG
NYXT> blog
(#<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
问题是当我试图找到它时:
NYXT> (find blog small-list :test #'equal)
NIL
现在对我来说是最奇怪的部分,平等测试有效:
NYXT> (equal blog (last small-list))
T
谁能帮帮我?为什么 find 不适用于 blog 案例?这是否与 CLOS 以及应该如何比较对象有关?
谢谢
【问题讨论】:
-
last这个名字确实令人困惑,CL 之上的一组有用/流行的实用程序是 Alexandria (common-lisp.net/project/alexandria),它定义了last-elt
标签: common-lisp equality clos