【问题标题】:extracting a n element from a list with dolist on lisp使用 lisp 上的 dolist 从列表中提取 n 元素
【发布时间】:2018-06-18 14:13:19
【问题描述】:

我正在尝试创建一个函数,它将字母列表作为参数,将单个字母作为参数。我想从列表中删除单个字母。

(defun extract-all (lett li)
   (let ((new-list nil))
     (dolist (letter li new-list)
        (if (eql lett letter)
             (setf new-list (cons nil new-list))
          (setf new-list (cons letter new-list))))))

所以如果我使用(extract-all 'n '(i n t e l l)) 调用该函数,我希望它返回i t e l l 并删除n

【问题讨论】:

    标签: linux lisp common-lisp


    【解决方案1】:

    首先,您没有删除字母 (characters),而是 symbols:

    (type-of 'n)
    ==> SYMBOL
    

    其次,有一个标准函数remove可以做到这一点:

    (remove 'n '(i n t e l l))
    ==> (I T E L L)
    

    第三,如果你删除你的“then”子句和reverse结果,你会得到你想要的:

    (defun my-remove (object list)
      (let ((new-list nil))
        (dolist (element list (nreverse new-list))
          (unless (eql object element)
            (push element new-list)))))
    (my-remove 'n '(i n t e l l))
    ==> (I T E L L)
    

    注意还有更多的方法可以给猫剥皮,例如,

    (defun my-remove (object list)
      (loop for element in list
        unless (eql object element)
        collect element))
    

    但是,最好使用该库。

    另见Where to learn how to practically use Common Lisp

    【讨论】:

    • 除非的目的是什么?是别的什么吗?
    • 哪个unlessthisthis?
    • 那么问题是什么?为什么 CL 有 if、cond、when 和 unless?或者他们做什么?这些都是合理的问题,请分开提问!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2011-03-19
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多