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

在Common Lisp中打印不含nil的列表问题求助

Common Lisp筛选限制范围外元素的问题解决

原代码的问题分析

  1. limits函数中错误使用nconc x:nconc是用于拼接列表的函数,参数必须是列表类型,但这里x是数值,直接返回x即可,无需调用nconc。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:22:10