【问题标题】:Why is the find function returning NIL in this case?为什么在这种情况下 find 函数返回 NIL?
【发布时间】: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&notrut=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 以及应该如何比较对象有关?

谢谢

【问题讨论】:

标签: common-lisp equality clos


【解决方案1】:

鉴于问题中定义的small-list(last small-list)列表 (#&lt;QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/&gt;)。所以,当然(find (last small-list) small-list) 应该返回nil,因为small-list 不包含元素(#&lt;QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/&gt;)(这是一个列表);而small-list 包含元素 #&lt;QURI.URI.HTTP:URI-HTTPS https://ambrevar.xyz/&gt;.

请记住,last 返回列表的最后一个 cons(如果您提供可选参数,则返回最后一个 n conses)。你可以这样做:(find (car (last small-list)) small-list)

另一种可能性是使用testkey 关键字参数:(find (last small-list) small-list :test #'equal :key #'list)。但是,我不确定什么时候我会比第一个解决方案更喜欢这个。

【讨论】:

    【解决方案2】:

    您的问题是您认为 last 在 common lisp 中返回列表的最后一个元素。但是如果你仔细看,它会返回最后一个被打包到列表中的元素! (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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 2014-09-12
      • 2018-04-26
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多