Lisp-所有列表的第一个元素(表面层面)

时间:2014-12-14 18:58:24

标签: list lisp common-lisp

我是Lisp中的新手,我正在尝试返回所有列表元素的第一个元素列表 一个给定的列表,在表面层面上有奇数个元素。 示例:(1 2(3(4 5)(6 7))8(9 10 11))=> (1 3 9)。

这就是我想出来的:

(defun firstEl(L1)
  (cond
    ((null L1)   
           nil
    )
    ((LISTP (List L1))
          (firstEl (rest L1))
          (append (List L2) (first L1))
     )
    (t 
       (firstEl (rest L1) L2)
    )       
  )
)

非常感谢。

1 个答案:

答案 0 :(得分:1)

我经常发现mapcan等函数对递归列表处理很有用:

(defun firstEl (value)
  ;;(print value)
  (if (listp value)
      (let ((first-value (first value))
            (tail (mapcan #'firstEl value)))
        (if (and (numberp first-value)
                 (oddp first-value))
            (cons first-value tail)
            tail))
      '()))