2011-11-05 3 views
2

함수 manageFirstList은 시간에 하나의 요소를 전역 목록 x에 반복적으로 복사해야합니다.전역 변수 및 목록 함수

(define test1DataA '(("a" "a") ("b" "b") ("c" "c") ("d" "d") ("e" "ok"))) 
(define test1DataB '(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("ok" "Ir OK!"))) 

(define x '()) 

(define manageFirstList 
    (lambda (a b) 
    ((cond ((not (null? b)) 
      ((append x (car a)) 
      (manageFirstList (cdr a) b))))))) 

(define ff (lambda (a b) (manageFirstList a b))) 

(ff test1DataA test1DataB) 

하지만 오류가 발생합니다

car: expects argument of type <pair>; given '() 

질문은 다음과 같습니다

  1. 어떻게 글로벌 가치 'X'를 업데이트 할을?
  2. 목록을 올바른 방법으로 연결하려면 어떻게합니까?
  3. 나는 이런 식으로 (또는 해결 방법이) 1 개 이상의 함수를 호출 할 수 있습니다 :

    ((append x (car a)) 
    (manageFirstList (cdr a) b)) 
    

편집 : 난 할 노력하고있어 각각의 첫번째 값 목록을 만드는 것입니다 test1DataA 목록 항목과 각 test1DataB 목록 항목의 두 번째 값입니다. 여기서 test1DataA 목록 요소의 두 번째 값은 test1DataB 요소의 첫 번째 값과 같습니다. 귀하의 질문에 대해

답변

2

:

  1. 당신이 , 당신은 정말이 제도를 사용하여 프로그래밍 할 수있는 좋은 방법이 아니다, 안 (set! x <value>)를 사용하여 함수 내에서 전역 변수를 업데이트 할 수 있지만, 대신에 프로 시저에서 새 목록을 반환해야하며 나중에 반환 값을 x에 할당해야합니다.
  2. "올바른 방법"은 무엇을 의미합니까? append 프로 시저는 두 개의 목록을 연결합니다. 나에게 묻는다면 그것을 할 수있는 올바른 방법입니다. :) 당신은 단순히 다음과 같이 호출 : 모두 ab 나열해야합니다 (append a b),
  3. 코드는 괄호의 추가 쌍 사이 append에 대한 호출을 둘러싸고 있기 때문에, 계획이 값을 적용하려고합니다, 잘못 에 의해 반환되고, 인수가 (manageFirstList (cdr a) b) 인 프로 시저 인 것처럼 보이며, 분명히 실패합니다. append이 프로 시저가 아닌 목록을 반환하기 때문에 분명히 실패 할 것입니다. 그리고 아마도 "하나 이상의 기능을 호출 할 수 있습니까?"라는 것이 무엇을 의미하는지 정확히 설명해야합니다. 물론 할 수는 있지만 무엇을 할 계획입니까? 양쪽 호출의 결과를 결합 하시겠습니까? 결과를 독립적으로 처리 하시겠습니까? 어쨌든

은, 위의 절차는 여러 가지 이유로 실패 할 것입니다 - 목록, 당신은 목록 중 하나에 반복하고 null이 때의 경우를 고려하지 않는 등 마지막

, 당신은 (ff test1DataA test1DataB)으로 전화 한 후에 절차에서 기대되는 결과가 무엇인지 명확히해야합니다. x에보고 싶은 값은 무엇입니까? 당신의 질문의 일부로 쓰십시오. 왜냐하면 "재귀 적으로 한 번에 하나의 요소를 전체 목록 x에 복사"라는 텍스트가 충분히 명확하지 않기 때문입니다.

편집 :

좋아, 여기 내 샷이 질문에 대답에, 난 내가 제대로 이해 바랍니다.당신이 절대적으로 변경해야하는 경우,

(define (manageFirstList lst1 lst2) 
    (cond ((null? lst1) '()) 
     (else (cons (list (caar lst1) (cadr (assoc (cadar lst1) lst2))) 
        (manageFirstList (cdr lst1) lst2))))) 

지금 : 나는 따라서 연관리스트로 두 번째 목록을 해석, 두 번째 목록에서 첫 번째 목록에서 각각 두 번째 값을 검색하는 assoc 절차를 사용하고 공지 사항 x 전역 변수의 값은, 단순히 같은 것을 할 : 나는 완전히 문제를 해결하기위한 계획 방법이 아니다 그 일반적으로 이후 절차 내에서 x을 수정할 필요가 피할 방법

(define x '()) 
(set! x (manageFirstList test1DataA test1DataB)) 

알 수 있습니다. 마지막으로 x의 값은 다음과 같습니다.

(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("e" "Ir OK!")) 
+0

감사의 말. 내가 뭘 하려는지 각 test1DataA 목록 항목의 첫 번째 값과 test1DataA 목록 요소의 두 번째 값이 test1DataB의 목록 요소의 첫 번째 값과 동일한 각 test1DataB 목록 항목의 두 번째 값으로 목록을 만드는 것입니다. 그것이 x 값이 유지해야하는 것입니다. – Trac3

+0

결과 목록을 단어로 설명하는 대신 원하는대로 작성하면 훨씬 더 명확 해집니다. 어쨌든 나는 그것을 줄 것이다. –

+0

감사합니다 :) 귀하의 답변은 제가 SCHEME에 대해 더 많이 이해할 수 있도록 도와주었습니다. – Trac3