참조에 의한 전달 방식
-
16-09-2020 - |
문제
구성표에서 참조로 변수를 어떻게 전달할 수 있습니까?
내가 원하는 기능의 예:
(define foo
(lambda (&x)
(set! x 5)))
(define y 2)
(foo y)
(display y) ;outputs: 5
또한 참조로 반환하는 방법이 있습니까?
다른 팁
Jari가 말했듯이 일반적으로 Scheme에서는 부작용을 남용하고 있음을 암시하므로 참조로 전달하는 것을 피하고 싶습니다.
하지만 원할 경우 참조로 전달하려는 모든 항목을 cons
상자.
(cons 5 (void))
5개가 들어있는 상자가 생성됩니다.이 상자를 5를 6으로 변경하는 프로시저에 전달하면 원래 상자에도 6이 포함됩니다.물론 기억해야 할 점은 cons
그리고 car
적절한 경우.
Chez Scheme(및 기타 구현)에는 다음과 같은 절차가 있습니다. box
(그리고 그 동료들 box?
그리고 unbox
) 특히 이 권투/언박싱 넌센스에 대해: http://www.scheme.com/csug8/objects.html#./objects:s43
매크로를 사용할 수 있습니다 :
scheme@(guile-user)> (define-macro (foo var)`(set! ,var 5))
scheme@(guile-user)> (define y 2)
scheme@(guile-user)> (foo y)
scheme@(guile-user)> (display y)(newline)
5
. 람다!
(define (foo getx setx)
(setx (+ (getx) 5)))
(define y 2)
(display y)(newline)
(foo
(lambda () y)
(lambda (val) (set! y val)))
(display y)(newline)
. JARI는 적어도 변수로 적어도 참조로 통과하는 것이 다소 상안하지 않습니다.그러나 원하는 행동이 사용되며 종종 폐쇄를 사용하여 더 많은 계획에서 항상 더 많은 계획을 세웁니다. "181 페이지 및182 (Google 도서)의 노련한 체계에서 더 나은 직업을 수행하면 그것을 설명 할 수 있습니다.
여기서는 C와 같은 C와 같은 C와 같은 C와 같은 구문을 사용할 수있는 매크로를 제공하는 참조가 있습니다.Olegs 사이트는 흥미로운 읽기를위한 금광이므로 아직하지 않은 경우 도서를 도서하십시오.
바깥 쪽 컨텍스트에서 정의 된 함수 내에서 외부 컨텍스트에 영향을 줄 수 있습니다. 이는 참조 변수로 통과의 영향을 제공합니다.
(define (outer-function)
(define referenced-var 0)
(define (fun-affects-outer-context) (set! referenced-var 12) (void))
;...
(fun-affects-outer-context)
(display referenced-var)
)
(outer-function) ; displays 12
.
이 솔루션은 부작용의 범위를 제한합니다.
그렇지 않으면 Erjiang이 제안한 셀 솔루션과 동일한 ELI에 의한 하위 인 ELI에 의해 언급 된 바와 같이 (Unbox X) 등이 있습니다.
C, PHP 또는 무엇이든지 너무 많은 것을 사용할 수 있습니다. Scheme에서는 pass-by-*과 같은 것들을하고 싶지 않습니다. 첫 번째 범위의 의미와 다른 구현이 어떻게 행동 하는지를 이해하십시오 (특히 Lisp와 Scheme의 차이점이 무엇인지 알아 봅니다).
에센스에 의해 순수한 기능적 프로그래밍 언어는 부작용이 없습니다.결과적으로 Pass-by ref가 기능적 개념이 아니라는 것을 의미합니다.