2017-01-20 10 views
0

일반적으로 라켓 및 함수 언어를 처음 사용합니다. 지금은 목록에 항목을 추가하려고합니다. 개념은 조금 혼란스럽고 왜 코드가 작동하지 않는지 확신 할 수 없습니다.라켓에서 새로 정의 된 목록에 요소 추가

내적 계산을하려고합니다.

두 개의 목록 (A와 B)을 가져 와서 해당 요소를 각각 곱하는 "dProduct"라는 함수가 있습니다.

;function takes dot product 
    (define (dProduct A B) 

     (define C '()) ; define list to store the multiplied elements 

     ;multiply ea lists elements 
     (for ([i A] [j B]) 
     (display (* i j)) ;THIS WORKS 
     (cons (* i j) C) ;APPARENTLY DOESN'T WORK 
    ) 

     ;THIS FOR LOOP DISPLAYS NOTHING 
     ;display the new list "C" 
     (for ([k C]) 
     (display k) 
    ) 

    ) 

왜 새 곱셈 된 요소를 새 목록 "C"앞에 추가 할 수 없는지 이해할 수 없습니다. 내가 뭘 놓치고 있니? 모든 것이 잘 컴파일됩니다. 이 기능을 끝낼 수 있도록 이것을 알아 내고 싶습니다. 어떤 도움도 좋을 것입니다. 감사!

+0

무료 구성표 : [How To Design Programs] (http://www.htdp.org) (DrRacket의 내장 도움말에서 링크 됨, 그 자체로 우수함); [컴퓨터 프로그램의 구조와 해석] (https://mitpress.mit.edu/sicp/full-text/book/book.html). – molbdnilo

답변

3

목록은 변경 불가능하며 cons이 아니며은 기존 목록에 요소를 추가합니다. 귀하의 질문은 태그 때문에

> (define x '(2 3)) 
> (cons 1 x) 
'(1 2 3) 
> x 
'(2 3) 

, 당신이 아마 기능적으로이 작업을 수행하는 방법을 알고 싶어한다고 가정하며, 함수형 프로그래밍은 일반적으로 변이 값이나 바인딩을 낙담 : 대신 앞에 추가 요소와 함께 새 목록을 생성 .

바인딩을 변경하는 대신 기능적으로 새로운 구조를 구축해야합니다. 이 작업을 수행하는 가장 쉬운 방법은 반환 값의 목록이 생성 for/listfor의 사용을 변경하는 것입니다 :이 프로그램의

(define C 
    (for/list ([i A] [j B]) 
    (* i j))) 

을, 당신은 고차 기능 map를 사용하여도 간단하게 만들 수있는, 항상 #<void>을 반환

(define C (map * A B)) 

for 때문에,이 부작용을 생산에만 유용하고, 함수형 프로그래밍, 당신은 일반적으로 시도하고 부작용을 유지 : 이는 여러 목록 인수를 제공 "우편 번호"와 같은 역할을 ~까지. 이런 이유로 for/listfor/fold은 보통 for보다 관용적 인 라켓에서 훨씬 더 일반적으로 유용합니다.

-1

현재 C 목록 (cons (* i j) C)의 새로운 가치를 부여 할 수 있으며,이 set! 사용하여 수행 할 수 있습니다 :

(define (dProduct A B) 

    (define C '()) 

    (for ([i A] [j B]) 
    (displayln (* i j))   
    (set! C (cons (* i j) C))) ; NOTE set! HERE. 

    (for ([k C]) 
    (displayln k))) 

참고 set!의 사용은 권장하지하고 for/list 여기에 원하는 결과를 달성하기 위해 더 나은 방법이라고 .