我想知道我的功能有什么问题

时间:2014-05-19 17:06:42

标签: clisp

我希望获得以数字开头的所有子列表。所以我做了

(defun function (list)
  (cond
    ((atom list) nil)
    ((and (numberq (car list)) (consp (car list))) 
      (cons (function (car list)) (number (cdr list))) ) 
    ((not (and (numberq (car list)) (consp (car list)))) (function (cdr list))) ) )

(function '((3 f g h) l s (v k) (2 m n) (9 d) c))

它返回nil而不是((3 f g h) (2 m n) (9 d))

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想这大致是你要做的事情:

    
(defun f (lst)
  (when lst
    (let ((e (car lst)))
      (if (and (consp e) (numberp (car e)))
        (cons e (f (cdr lst)))
        (f (cdr lst))))))

或者,您可以使用remove-if-not

(defun f (lst)
  (remove-if-not 
   (lambda (e) (and (consp e) (numberp (car e)))) 
   lst))

在这两种情况下,它都按预期工作:

? (f '((3 f g h) l s (v k) (2 m n) (9 d) c))
((3 F G H) (2 M N) (9 D))