You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lisp检查Cons是否存在于Cons列表时返回nil问题排查

第一个代码问题原因

member函数默认使用eql作为相等性判断谓词,而你每次调用(cons z (cons y nil))都会在内存中创建一个新的cons对象,即使这个新对象的内容和graph列表中已有的(1 2)完全一致,两个不同内存地址的cons对象用eql比较的结果也是nil,所以member始终匹配失败。
解决方案是给member显式指定相等性谓词,用可以比较内容的equal:

(member (cons z (cons y nil)) graph :test #'equal)

第二个修改后代码问题原因

  1. findEdge的遍历逻辑错误
    你的loop循环在第一次遍历元素时就会直接返回:如果第一个元素不等于目标edge,就直接返回nil,根本不会继续遍历后续的元素。比如你要找(1 2),如果graph第一个元素是其他值,直接就返回失败了。
  2. loop没有正确返回判断结果
    你在循环中调用return-true/return-false只是执行了函数得到返回值,但没有将这个值作为loop的返回值抛出,默认情况下loop执行完所有迭代后会返回nil,所以即使匹配到了目标,函数最终也返回nil。

正确的findEdge可以写成:

(defun findEdge(graph edge)
  (loop for x in graph
        when (equal x edge)
        return t
        finally (return nil)))

或者更简单直接用自带的member就可以完成需求,不需要自己实现findEdge:

(if (and (member (list z y) graph :test #'equal)
         (member (list z x) graph :test #'equal))
    (write "TEST"))

内容的提问来源于stack exchange,提问作者MaddieP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:45:11