【问题标题】:Lisp: remove all a's from a given list and return non-a valuesLisp:从给定列表中删除所有 a 并返回非 a 值
【发布时间】:2021-12-16 17:10:46
【问题描述】:

我尝试返回列表中与“a”不匹配的所有元素。 这是我到目前为止所尝试的。

(defun removeA (arr) 
     (cond((null arr) nil) 
          ((if (listp (car arr))
               (or (removeA (car arr)) (removeA (cdr arr)))
          (if (eql 'a (car arr))      
              (removeA (cdr arr)) 
          (cons (car arr) (removeA (cdr arr)))
)
))
)

) (print (removeA '(a (a) (v a e) (a a) d)))

here is the output: (V E)

i need help on why its not printing "D" as well

【问题讨论】:

  • 提示:您需要做的第一件事是发布正确缩进的代码。您发布的代码没有正确缩进。接下来是:检查 COND 的语法以及它应该如何使用。
  • 预期的结果是什么?应该是(v e d),还是((v e) d),还是(() (v e) () d),...? cond 已经是条件形式:为什么要嵌套 if 形式?正确的代码格式将帮助包括您自己在内的所有人阅读您的 lisp 代码。

标签: lisp common-lisp


【解决方案1】:

我的解决方案:

(defun removeA (ls)
  (let ((withoutA
          (if (consp ls)
            (remove-if #'(lambda (l) (equal l 'a)) ls)
            ls)))
    (if (consp ls)
      (mapcar #'removeA withoutA)
      ls)))

(print
  (removeA '(a (a) (v a e) (a a) d)))

打印出(NIL (V E) NIL D)

NILs 代表空列表。

【讨论】:

    【解决方案2】:

    该程序的规范似乎是这样的:

    • 输入是单个项目或列表的列表
    • 如果是单个项目,如果它是值'a',则将其删除
    • 如果是列表,则删除其中所有值为“a”的项目

    我的第一反应是在输入列表上映射一个函数,使用 mapcar 或类似的东西 - 如果您使用的是 carcdr,则值得检查一下是否有更高级别的方法来执行同样的事情。

    但是,我被建议使用mapcar 效率低下,更好的方法是使用looploop 构造是一个宏,loop 在函数位置,后面是英文风格的一系列单词。

    (defun remove-a (lst)
      (loop
       for x in lst
       if (listp x) collect (remove-if #'isa-p x)
       else collect (if (isa-p x) nil x)))
    
    (defun isa-p (val) (equal val 'a))
    

    因此:

    (remove-a  '(a (a) (v a e) (a a) d))
    (NIL NIL (V E) NIL D)
    

    可以使用Alexandria:flatten 将结果展平为单个列表,您需要先使用(ql:quicklisp 'Alexandria) 加载该列表。

    如果要使用carcdr,我的cmets如下。

    您作为输入提供的是一个列表,但您称它为arr,暗示一个数组;数组在 Common Lisp 中是非常不同的东西。

    你的ifcond 弄错了。函数cond 类似于其他语言中的switch-case。在使用cond 考虑各种可能性之前,您想使用if 检查一个空列表。

    您正在使用print 来显示结果。如果您使用的是 REPL,则不需要这样做。 (print a)a 在 REPL 中是等价的。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2011-07-02
      • 2023-03-09
      • 2014-03-16
      • 2013-07-11
      • 1970-01-01
      相关资源
      最近更新 更多