为什么在这种情况下 find 函数返回 NIL?
Why is the find function returning NIL in this case?
我是 Common Lisp 的新手,尤其是 CLOS。我在名为 Nyxt 的包中使用 REPL。
Nyxt 旨在成为一个可无限扩展的浏览器。因此,用户可以在程序 运行 时更改代码 and/or 创建扩展。这是设计的实时黑客能力。我的问题与 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
通常是 lisp returns 列表的最后一个元素。但是如果你仔细看,它 returns 最后一个元素被打包成一个列表!
(car (last small-list))
是您认为 last
实际所做的。
(defparameter blog (car (last small-list)))
(find blog small-list :test #'equal)
会起作用的!
(equal blog (last small-list))
不是正确的测试。因为 blog
您之前使用定义
(last small-list)
所以当然是 equal
.
鉴于问题中定义的 small-list
,(last small-list)
是 list (#<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
。所以,当然 (find (last small-list) small-list)
应该是 return nil
,因为 small-list
不包含元素 (#<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
(这是一个 列表);而 small-list
包含 元素 #<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>.
请记住,last
return 是列表的最后一个 cons(如果您提供可选参数,则为最后一个 n
cons ).你可以这样做:(find (car (last small-list)) small-list)
.
另一种可能性是使用 test
和 key
关键字参数:(find (last small-list) small-list :test #'equal :key #'list)
。但是,我不确定什么时候我更喜欢这个而不是第一个解决方案。
我是 Common Lisp 的新手,尤其是 CLOS。我在名为 Nyxt 的包中使用 REPL。
Nyxt 旨在成为一个可无限扩展的浏览器。因此,用户可以在程序 运行 时更改代码 and/or 创建扩展。这是设计的实时黑客能力。我的问题与 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
通常是 lisp returns 列表的最后一个元素。但是如果你仔细看,它 returns 最后一个元素被打包成一个列表!
(car (last small-list))
是您认为 last
实际所做的。
(defparameter blog (car (last small-list)))
(find blog small-list :test #'equal)
会起作用的!
(equal blog (last small-list))
不是正确的测试。因为 blog
您之前使用定义
(last small-list)
所以当然是 equal
.
鉴于问题中定义的 small-list
,(last small-list)
是 list (#<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
。所以,当然 (find (last small-list) small-list)
应该是 return nil
,因为 small-list
不包含元素 (#<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>)
(这是一个 列表);而 small-list
包含 元素 #<QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/>.
请记住,last
return 是列表的最后一个 cons(如果您提供可选参数,则为最后一个 n
cons ).你可以这样做:(find (car (last small-list)) small-list)
.
另一种可能性是使用 test
和 key
关键字参数:(find (last small-list) small-list :test #'equal :key #'list)
。但是,我不确定什么时候我更喜欢这个而不是第一个解决方案。