如何在COND中不返回任何内容

时间:2015-11-16 12:41:02

标签: lisp common-lisp

所以我在lisp中创建了这个函数,并且在cond部分基本上如果满足条件,我返回一个包含2个值的列表,如果条件不满足,我想不什么都归还!这是:

(defun lista-dos-aprovados (turma)
  (mapcar (lambda (aluno)
            (cond ((> (media-notas (notas aluno)) 9.5)
                   (list (first aluno) (second aluno)))
                  (t nil)))
          turma))

名字是葡萄牙语,但我认为这并不重要。我想做的是当代码到达(t nil)部分时,我不希望它在我的列表中写NIL。我尝试没有T条件或在T之后将其留空,仍然始终写NIL

1 个答案:

答案 0 :(得分:3)

您可以删除nil结果中的mapcar,例如:

(defun lista-dos-aprovados (turma)
  (remove nil
          (mapcar (lambda (aluno)
                    (cond ((> (media-notas (notas aluno)) 9.5)
                           (list (first aluno) (second aluno)))
                          (t nil)))
                  turma)))

并注意您可以将功能简化为:

(defun lista-dos-aprovados (turma)
  (remove nil
          (mapcar (lambda (aluno)
                    (when (> (media-notas (notas aluno)) 9.5)
                      (list (first aluno) (second aluno))))
                  turma)))

或者您可以使用loop

(defun lista-dos-aprovados (turma)
  (loop for aluno in turma 
     when (> (media-notas (notas aluno)) 9.5)
     collect (list (first aluno) (second aluno))))