Я хочу написать функцию, которая удаляет конечный нуль из списка. Я впервые попробовал написать его элегантно с помощью рекурсии, но в итоге так:Lisp: Элегантный способ вырезать конечный ноль из списка? (Обзор)
(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))))
Это, возможно, ясно, но я не уверен. Есть ли более ленивый способ сделать это?
Разве он не должен быть lst вместо нуля в самом конце? Я предполагаю (strip-tail '(a b c d)) должен вернуться (a b c d). – sigjuice
Нет, это должно быть ноль. Да, так оно и должно работать. –
Doh! – sigjuice