在lisp上用dolist从列表中提取n个元素

时间:2018-01-09 14:05:55

标签: linux lisp common-lisp

您好我正在尝试创建一个函数,其中字母列表作为参数,单个字母作为参数。我希望从列表中删除单个字母。

Promise

因此,如果我使用(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

1 个答案:

答案 0 :(得分:4)

首先,你不是要删除信件 (characters),而是 symbols

(type-of 'n)
==> SYMBOL

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

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

第三次,如果您删除了"那么"条款和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