gpt4 book ai didi

coding-style - Lisp:从列表中删除尾随 nil 的优雅方法? (审查)

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:47 29 4
gpt4 key购买 nike

我想编写一个函数,从列表中删除尾随的 nil。我首先尝试用递归优雅地写它,但结果是这样的:

(defun strip-tail (lst)
(let ((last-item-pos (position-if-not #'null lst :from-end t)))
(if last-item-pos
(subseq lst 0 (1+ last-item-pos)))))

; Test cases.
(assert (eq nil (strip-tail nil)))
(assert (eq nil (strip-tail '(nil))))
(assert (equal '(a b) (strip-tail '(a b nil nil))))
(assert (equal '(a nil b) (strip-tail '(a nil b nil))))
(assert (equal '(a b) (strip-tail '(a b))))

可以说这很清楚,但我不相信。有没有更 lispy 的方式来做到这一点?

最佳答案

好吧,一个版本是:

  1. 反转列表
  2. 删除前导 nils
  3. 反转列表

代码:

(defun list-right-trim (list &optional item)
(setf list (reverse list))
(loop for e in list while (eq item e) do (pop list))
(reverse list))

这是另一种变体:

  1. 遍历列表并记下第一个 nil 的位置,后面只有 nils
  2. 返回子序列

代码:

(defun list-right-trim (list &aux (p nil))
(loop for i from 0 and e in list
when (and (null p) (null e))
do (setf p i)
else when (and p e) do (setf p nil))
(if p (subseq list 0 p) list))

关于coding-style - Lisp:从列表中删除尾随 nil 的优雅方法? (审查),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106789/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com