2013-03-09 2 views
-1

제목이 거의 모든 것을 말합니다.목록에 적어도 하나의 non-nil 요소가 포함되어 있는지 확인하십시오.

나는

(atleastonenonnil '(nil nil nil nil '(A B C))) 
=> T 

내가 재귀 방법으로 그것을 할 수처럼 무언가를 찾고 있어요,하지만 난 할 수 없습니다. 내장 함수를 사용해야합니까? 사용 중 cLisp

+4

http://www.lispworks.com/documentation/HyperSpec/Body/f_everyc.htm#some –

+0

대답으로 대답을 수락합니다. – Simbi

답변

2

목록의 첫 번째 요소를 처리하면 나머지는 모두 재귀 적으로 수행 할 수 있습니다. 코드는 다음과 같습니다.

(defun at-least-one-nonnil (l) 
    (and (not (nullp l)) 
     (or (car l) 
      (at-least-one-nonnil (cdr l)))))) 

물론이 간단한 경우에는 이미 내장 함수가 있습니다.

(defun at-least-one-nonnil-v2 (l) 
    (some #'identity l)) 

하지만 재귀에 대해 배우는 데 도움이되지는 않습니다.

+1

이 두 함수가 실제로 적어도 하나가 아닌 것은 아닌가요? 원하는 동작을 얻으려면 첫 번째 함수에서 마지막이 아닌 마지막 항목을 삭제하고 마지막에'# 'identity'로'# 'not'를 대체해야합니다. 또한, Common Lisp은'(defun function (args) ...)'를 사용하는 반면'(define (function args) ...) '는 scheme입니다. –