문제

구성표에서 참조로 변수를 어떻게 전달할 수 있습니까?

내가 원하는 기능의 예:

(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 사이트는 흥미로운 읽기를위한 금광이므로 아직하지 않은 경우 도서를 도서하십시오.

http://okmij.org/ftp/scheme/pointer-as.-closure.txt

바깥 쪽 컨텍스트에서 정의 된 함수 내에서 외부 컨텍스트에 영향을 줄 수 있습니다. 이는 참조 변수로 통과의 영향을 제공합니다.

(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가 기능적 개념이 아니라는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top