2016-08-11 3 views
-1

다음 기능 (일치 재 정의)이 작동하지 않는 이유는 무엇입니까?함수가 라켓에 값을 할당하지 않음

(define vlist (list 10 20 30)) 
(match-define (list aa bb cc) (list 1 2 3)) 
(define alist (list aa bb cc)) 
alist 
vlist 

(define (match-redefine dst_list src_list) 
    (for ((d dst_list)(s src_list)) (set! d s)) ) 

(rnmatch-redefine alist vlist) 
alist 
vlist 

출력은 :

'(1 2 3) 
'(10 20 30) 
'(1 2 3) 
'(10 20 30) 

대상 목록 (alist)이 변함. 이 기능을 작동시킬 수 있습니까?

편집 : 답변에 @OscarLopez에 의해 제안 나는 벡터를 시도했지만 작동하지 않습니다 :

(match-define (list a b c) (list 0 0 0) ) 
(define variable_vect (vector a b c)) 
a 
b 
c 

(define valuelist (list 1 2 3)) 
(for ((i variable_vect)(j valuelist)) ; does not work 
    (set! i j)) 
variable_vect 
a 
b 
c 

(set! variable_vect valuelist) 
(println "------- after ----------") 
variable_vect 
a 
b 
c 

출력은 다음과 같습니다

0 
0 
0 
'#(0 0 0) 
0 
0 
0 
"------- after ----------" 
'(1 2 3) 
0 
0 
0 

편집 : 그것은 내가 사용해야 할 것 같다 특별한 클래스는이 사항을 적용합니다 :

(define myob% 
    (class object% 
    (super-new) 
    (init-field val) 
    (define/public (getval) val) 
    (define/public (setval v) (set! val v)) )) 

(define (copyvalues objlist valuelist) 
    (for ((a alist)(v valuelist)) (send a setval v)) ) 

(define (show_objlist alist) 
    (for ((a alist)) (println (send a getval))) ) 

; USED AS FOLLOWS: 

(define ob1 (make-object myob% 5)) 
(define ob2 (make-object myob% 5)) 
(define ob3 (make-object myob% 5)) 
(define alist (list ob1 ob2 ob3)) 

(println "---------- first assignment -----------") 
(define vlist (list 1 2 3)) 
(copyvalues alist vlist) 
(show_objlist alist) 

(println "---------- second assignment -----------") 
(define ylist (list 10 20 30)) 
(copyvalues alist ylist) 
(show_objlist alist) 

(println "---------- individual access -----------") 
(send ob1 getval) 
(send ob3 getval) 

출력은 다음과 같습니다

"---------- first assignment -----------" 
1 
2 
3 
"---------- second assignment -----------" 
10 
20 
30 
"---------- individual access -----------" 
10 
30 
+2

당신은 로컬 변수'd' 만 수정하고 있으며, 라켓의 쌍은 어쨌든 없어지지 않습니다. – molbdnilo

+0

변경할 수있는 특수 키워드 또는 기능은 무엇입니까? – rnso

+1

언어를 언제든지 스키마 중 하나로 변경하거나 [변경 가능한 쌍] (http://docs.racket-lang.org/reference/mpairs.html)으로 작업 할 수 있습니다. 그러나 돌연변이 자체는 Schemey가 아니고 Rackety가 아니며 돌연변이 매개 변수가 더 그렇습니다. – molbdnilo

답변

1

다시 말하지만, 이것은 우리가 Scheme에서하는 방식이 아닙니다. 게다가 코드가 목록의 요소를 가리키는 로컬 변수를 다시 할당하기 만하면 대상 목록이 수정되지 않은 상태로 유지됩니다.

(define value_list (list 1 2 3)) 
(define value_vect (vector 0 0 0)) 

value_vect 
=> '#(0 0 0) 

(for [(i (in-range (vector-length value_vect))) 
     (value value_list)] 
    (vector-set! value_vect i value)) 

value_vect 
=> '#(1 2 3) 

어쨌든 당신이를 수정해서는 안 : -

당신은 목록 대신 벡터를 사용할 수

은 그 당신이 가장 일반적인 프로그래밍 언어로 같은 것을 배열을 수정하는 것과 동일하게 수정할 수 있습니다 변수 목록, 그냥 새 값으로 목록을 반환합니다. 그리고 목록을 변경하려고 생각하지 마십시오. 비록 이 가능하지만,이 상황을 다루는 올바른 방법은 아닙니다. 발생할 수있는 모든 것을 돌연변이에 대해 생각해보십시오!

+0

벡터도 작동하지 않습니다. 내 질문에 편집을 참조하십시오. – rnso

+1

@rnso 말했듯이, 벡터의 내용이 아닌 로컬 변수를 재 할당하고 있기 때문에 수정하려는 색인을 지정해야하므로 작동하지 않습니다. 내 업데이트를 참조하십시오. –

+0

변수 이름 a, b 및 c를 별도로 사용할 벡터에 보관할 수 있습니까? – rnso

2

기능이 작동하지 않는 이유를 묻습니다. 그 이유는 (set! d s)이 뭔가를하고 있다는 것입니다. 당신은 예상하지 못합니다.

관찰 :

#lang racket 
(define vlist (list 10 20 30)) 
(match-define (list aa bb cc) (list 1 2 3)) 
(define alist (list aa bb cc)) 
alist 
vlist 

(define (match-redefine dst_list src_list) 
    (for ((d dst_list)(s src_list)) 
    (set! d s) 
    (displayln (~a "d is now: " s)))) 

(match-redefine alist vlist) 

출력은 :

'(1 2 3) 
'(10 20 30) 
d is now: 10 
d is now: 20 
d is now: 30 

이것은 d 값 (안 d 실행을 통해 심볼에 해당하는 변수의 값을 변경하는 것을 의미한다.

같은 주제에 대한 이전 질문보기

관련 문제