2012-10-23 4 views
2

안녕하세요 여러분, 문자와 숫자가 혼합 된 목록을 구성하려고합니다. 예를 들어 funciton (inc-list1 '(cat 4 dog 3 x 5)) => (cat 5 dog 4 x 6)을 호출 할 때. 나는 논리가 옳다는 것을 확신한다. 그래서 나는 구문에서 뭔가를 놓치고 있다고 생각한다. 여기 내 코드가혼합 목록 작성

(defun inc-list1 (list) 
     (cond ((null list) 
       nil 
      ) 
      (numberp (first list) 
        (cons (+ 1 (first list)) (inc-list1 (rest list))) 
      ) 
      (T 
      cons (first list) (inc-list1 (rest list)) 
      ) 
     ) 
    ) 
+0

어떤 오류가 발생합니까? – joergl

답변

0

코드에 여러 가지 오타가 있습니다. 여기서 고정 버전

(defun inc-list1 (list) 
    (cond ((null list) 
      nil 
     ) 
     ((numberp (first list)) 
      (cons (+ 1 (first list)) (inc-list1 (rest list))) 
     ) 
     (t 
      (cons (first list) (inc-list1 (rest list))) 
     ) 
     ) 
) 

참고 numberpcons 함수 호출 주위 첨가 괄호와 소문자의 t이다.

1

문제를 접근 한 수있는 방법의 예 : 너무 다른 상황에서 좀 더 유용한 기능을 만들 것

(defun mapcar-if (list test if-true &optional (otherwise #'identity)) 
    (mapcar 
    #'(lambda (x) 
     (funcall 
     (if (funcall test x) 
      if-true 
      otherwise) x)) list)) 

(mapcar-if '(cat 4 dog 3 x 5) #'numberp #'1+) 

.

귀하의 코드 :

  1. (T cons ...)

    당신이 그것을하지 생각하지 않습니다. 으로 전화하고 싶다면 단순히cons으로 전화하십시오. 당신이했던 방식으로 그것을 언급하는 것은 효과가없고 부작용이 없다. (심볼 cons가 언 바운드 된 경우, 즉 에러가 발생한다면 부작용이있다.) 다음에 일어나는 일은 이전 오류의 결과입니다. (first list)을 호출해도 부작용이 없습니다 (귀하의 경우).

  2. "consing"하는 방식으로 목록을 작성하는 것이 특히 좋은 방법은 아닙니다. 이 기술은 다른 기능 (예 : mapcar, reduce 등)에 이미 구현되어 있기 때문에 프로그램 작성을 위해 입력해야하는 텍스트의 양을 줄이고 읽기 쉽도록 텍스트의 양을 줄이기위한 목적으로 작성되었습니다. 그것을 썼다. ;)