2009-11-10 6 views
2

람다 매개 변수를 사용하는 함수를 통해 변수 값을 변경하려면 어떻게해야합니까? 즉 :스킴 세트!

;;definitions 
(define test "fails") 
(define (experiment input) (set! input "works")) 

;;interactions 
> test 
"fails" 
> (experiment test) 
> test 
"fails" 

이 실패 할 것 같다 ..

감사

답변

9

당신은 할 수 없습니다 - experiment 기능 위는 단순히 자신의 입력을 수정에 있도록 계획은, "값에 의해"모든 값을 전달 논의. 당신이 정말 변수의 값을 변경하려면

(define test (box "fails")) 
(define (experiment input) (set-box! input "works")) 
(unbox test) 
(experiment test) 
(unbox test) 

, 당신은 매크로를 사용할 수 있습니다 :

이 작업 뭔가를 얻으려면, 당신은 명시 적으로 변경 가능한 값의 컨테이너 상자를 사용할 수 있습니다
(define-syntax-rule (experiment input) (set! input "works")) 

이렇게하면 매크로로 experiment이 생성되므로 모든 (experiment foo) 양식이 (set! foo "works")으로 다시 작성됩니다. 이것은 미묘한 결과를 가져올 수 있으므로 수행중인 작업을 알지 못하면 사용하지 않는 것이 좋습니다. 예를 들어 (experiment 2)은 "재미있는"방법으로 실패합니다. Scheme에서 매크로를 작성하는 것은 쉽지만 매크로를 작성하는 것은 새로운 함수 정의를 작성하는 것보다 여전히 어렵습니다.

[이 답변에서 PLT Scheme을 사용하고 있다고 가정합니다. 그러나 두 부분은 필요한 경우 "표준"제도로 번역 할 수 있습니다 -. 예를 들어, 최초의 가변 cons 셀을 사용하고 초 syntax-rulesdefine-syntax를 사용] 당신이 고려하는 경우

+0

자세한 설명을 주셔서 감사합니다. – Hellnar

+0

이것은 매개 변수를 사용하여 수행 할 수도 있습니다. http://srfi.schemers.org/srfi-39/srfi-39.html –

+0

예, 매개 변수는 또 다른 변경 가능한 종류의 컨테이너입니다 (PLT에는 ' 스레드 셀 '). 그러나 이들의 의미는 일반 세계와 미묘하게 다를 수 있습니다. 예를 들어, 매개 변수는 각 스레드에 대해 고유 한 값을가집니다 (정확하게 말하면, 각 연속에 대해 고유 한 값). –

0

어쩌면 더 나을 파이썬에서 같은 코드 :

test = "fails" 
def experiment(input): 
    input = "works" 

>>> test 
'fails' 
>>> experiment(test) 
>>> test 
'fails' 
+0

이 질문에 어떻게 대답합니까? –