记一“坑“

本文探讨了一个有趣的现象:在Lisp中使用sort操作后,原本应该能找到的元素突然找不到的问题。通过对代码的逐步调试,发现sort操作改变了原列表的结构,进而影响了find操作的结果。文章提供了修正方法,并总结了教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:

     从一列表中,查询一子列表(用 remove-if or remove-if-not) ,然后遍历排序子列表,再处理子列表中的数据,同时需要从原始列表中查找(find)数据。

    因为子列表的数据是从原始列表中提取出来的,所以子列表是原列表的子集,find操作肯定可以成功,但却发现有有find结果为NIL现象。

结论:

    一番调试折腾之后发现:sort操作破坏了原列表的结构。猜测原因是子列表是通过原列表得到的,两者可能共用了部分数据结构,导致看似无关的lst2却影响到了了lst。通过将lst2 copy之后再sort,解决此问题。

教训:

    sort是破坏性操作,在不确定其参数被破坏影响的情况下,最好对参数执行copy-list,生成副本数据。

 

简化代码:

(defun test-1 nil
   (let ((lst '(1 2 3 4)))
       (let ((lst2 (remove-if (lambda (x) (member x (list 2 3))) lst)))
               ;(sort lst2 #'>)
               (print (sort (copy-list lst2) #'>))
               (unless (find 4 lst)
                    (print "not found 4")
                    (print lst)))))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值