在Common Lisp中打印不含nil的列表问题求助
Common Lisp筛选限制范围外元素的问题解决
原代码的问题分析
limits函数中错误使用nconc x:nconc是用于拼接列表的函数,参数必须是列表类型,但这里x是数值,直接返回x即可,无需调用nconc。out-of-limits函数逻辑错误:mapcar执行后生成的带nil的列表没有传递给remove nil,Lisp函数的返回值是最后一个表达式的结果,原代码中最后一行(remove nil)相当于无目标列表调用,无法正确过滤nil。
修正后的代码方案
方案一:修正原有函数结构
(defun limits (x) (if (or (< x 3) (> x 12)) x ; 直接返回符合条件的元素 nil)) (defun out-of-limits (l) (remove nil (mapcar #'limits l))) ; 将mapcar的结果作为remove的处理对象
调用(out-of-limits '(1 7 8 2 5 1 215))会返回(1 2 1 215),符合预期。
方案二:更简洁的直接筛选(推荐)
不需要单独定义limits函数,直接用remove-if一步完成筛选:
(defun out-of-limits (l) (remove-if (lambda (x) (and (>= x 3) (<= x 12))) l))
这个函数直接移除3到12之间的元素,剩下的就是目标列表,避免生成带nil的中间列表,效率更高。
内容的提问来源于stack exchange,提问作者M1ctl4nt3cutl1
相关产品推荐
相关产品推荐

