2012-04-28 3 views
4

목록을 다른 함수/프로 시저로 보내고, 목록에서 항목을 삭제하고, 새 목록을 업데이트하고 (항목이 제거됨) 어떻게 첫 번째 함수/순서.Scheme (Racket)에서 목록을 업데이트하는 방법

또한 세트를 사용할 수 있습니다. 목록을 업데이 트하지만, 내가 사용 설명서 세트를 사용하여 계속보고! "계획 방식"이 아닙니다.

, 나는 (작동하지 않는)이 방법 외에도이 프로그램을 만드는 방법을 다른 이해가 안 :

#lang racket 

(define list1 '("read" "id" "$$")) 

(define (displayer list1) 
    (remover list1) 
    (newline) 
    (display list1)) ;also doesn't display updated list here 

(define (remover list1) 
    (remove "$$" list1) 
    (display list1)) ;doesn't display updated list here 

감사합니다!

(displayer list1) 

가 표시됩니다 :

(read id $$) 

을하지만 그것을 변경하는 경우 : 코드와

답변

3

내가 작성하는 경우

#lang racket 

(define list1 '("read" "id" "$$")) 

(define (displayer list1) 
    (display (remover list1))) 

(define (remover list1) 
    (remove "$$" list1)) 

이 방법을 사용하면

을 실행할 때
(displayer list1) 

그것은

(read id) 

는 함수형 언어에서 그 기억이 반환됩니다 모든는 변경할 수 없습니다가 (주없이 작업하는 쉽게, 검증, 최적화 및 병렬화 할 수 있습니다 선호하는 방법 인 표현이며, "변수"를 다루는 프로그램을 작성하고 이러한 작업을 수행하는 자동화 된 도구를 작성하는 것이 더 쉽습니다. 자세한 내용은 http://en.wikipedia.org/wiki/Functional_programming#Comparison_to_imperative_programming) 이므로 목록에서 요소를 제거한 다음 적은 요소로 새 목록을 반환하는 함수를 작성해야하는 경우

반면에 Racket은 Haskell과 같은 순수한 함수 언어가 아니므로 언급, 당신은 정말이 같은 필수적인 방법으로 라켓을 사용할 수 있습니다 "List1입니다"변수에 의해 참조되는 값을 재정의하려는 경우 :

#lang racket 
(define list1 '("read" "id" "$$")) 

(define (displayer list1) 
    (set! list1 (remover list1)) 
    (newline) 
    (display list1)) 

(define (remover list1) 
    (remove "$$" list1)) 

세트를! 당신은 여기에 대한 자세한 내용을보실 수 있습니다

지금부터 새로운 값을 가리 키도록 목록 1 리디렉션 : http://htdp.org/2003-09-26/Book/curriculum-Z-H-44.html

1
(remove "$$" list1) 

반환을 "$$"제거와 list1을하지만, 변경되지 않습니다list1 .따라서 용액은 remover 호출 화면을 호출하는 것이다

(display (remover list1)) 

및 "$$"을 제거 remover 다시 구현할 있지만 다른 부작용 (출력 부작용이다)이 아니오

(define (remover list1) (remove "$$" list1)) 
3

질문에서 말한 것처럼, 이것은 실제로 입니다. 실제로 Scheme에서 일을하는 방식이 아닙니다. 그럼에도 불구하고 당신은 라켓에서 set!로 묻는 것을 달성 할 수 있습니다 - 전역 적 정의와 초기 바인딩의 재정의를 허용하는 언어 선택 - 언어 설정을 혼란에 빠뜨려야한다는 사실은 당신이하고있는 꽤 명확한 표시가되어야합니다 틀렸어.

(define list1 '("read" "id" "$$")) 

(define (displayer) 
    (remover) 
    (newline) 
    (display list1)) 

(define (remover) 
    (set! list1 (remove "$$" list1)) 
    (display list1)) 

(displayer) 
> (read id) 
> (read id) 

더 관용적 접근 방식은 그들에게 내부 절차를 수정하기위한 전역 변수를 정의하지 않도록하는 것입니다;

어쨌든, 여기 방법 대신 때마다이 같은 새로운 하나를 (remove 새로운리스트를 생성) 생성 목록을 수정하고 그것을 주변에 전달해야합니다 : 두 번째 솔루션은 하지list1을 수정한다는 것을

(define (displayer lst) 
    (let ((removed (remover lst))) 
    (newline) 
    (display removed))) 

(define (remover lst) 
    (let ((removed (remove "$$" lst))) 
    (display removed) 
    removed)) 

(define list1 '("read" "id" "$$")) 
(displayer list1) 
> (read id) 
> (read id) 

공지 사항, 그 기능을이다 방법으로 문제를 해결할 수 있습니다.

관련 문제