2014-09-17 4 views
0

나는에 대한-각 체계에 새로운 목록을 생성하지 않는 것을 이해하지만 내 출력에, 나는 예상 : 난 그냥 "완료"얻고각각에 대한-하지 않는 출력 값은

4 
9 
16 
done. 

.

여기 무슨 일 이니?

(define (for-each proc list) 
    (cond ((null? list) "done") 
      (else 
       (proc (car list)) 
       (for-each proc (cdr list))))) 


(define square (lambda(x)(* x x))) 
(square 5) 

(for-each square (list 2 3 4)) 
+0

각 언어의 표현식 결과가 for (each) 루프에 자동으로 출력되지 않습니다. 예. 'foreach $ i (1..3) {$ i + $ i}'perl. 각 블록은'$ i'의 이중으로 평가되지만 저장되거나 인쇄되지는 않습니다. 나는 다른 알골 방언에서 그것을 시도하지 않았지만 같은 결과를 얻게 될 것입니다. – Sylwester

답변

4

코드에서 (proc (car list)) 코드는 실행될 수 있지만 그 결과는 무시됩니다. 그냥 제곱 함수의 결과를 인쇄 할 경우이 시도 :

(for-each (lambda (x) (display (square x)) (newline)) ; applies function on each element 
      '(2 3 4)) 
=> 4 
    9 
    16 
    done 

당신이 입력 목록의 각 요소에 대해 절차를 적용하는 결과를 얻을하려는 경우, 당신은 map하지 for-each을 사용해야합니다 :

(map square '(2 3 4)) 
=> '(4 9 16) 

for-each 입력리스트를 반복 실행하고 각 구성 요소를 통해 동작을 수행하지만, 단지 그 효과 용 (예를 들어, 각 소자를 인쇄). 출력 목록에 결과를 누적하지 않으며 명시 적으로 언급하지 않는 한 도 인쇄하지 않습니다. 반면에 map은 입력리스트를 반복하고 각 요소에 대해 연산을 수행 한 다음 출력에 결과를 누적합니다 명부.

+0

각각에 대해 각 요소에 대한 출력을 표시 할 수 있습니까? – runners3431

+0

@ runners3431 예, 그렇지만'map'과 달리 결과를리스트에 누적하지 않습니다. –

+0

내가 이렇게 할 수 있을까? (for-each (display (proc (cdr list)))) – runners3431