11 Stimmen

Schema Pass-by-Reference

Wie kann ich eine Variable per Referenz im Schema übergeben?

Ein Beispiel für die von mir gewünschte Funktionalität:

(define foo
  (lambda (&x)
    (set! x 5)))

(define y 2)

(foo y)

(display y) ;outputs: 5

Gibt es auch eine Möglichkeit, per Referenz zurückzukehren?

2voto

Sie können einen äußeren Kontext von einer Funktion aus beeinflussen, die in diesem äußeren Kontext definiert ist, wodurch Sie die Wirkung von Referenzvariablen, d. h. Funktionen mit Seiteneffekten, erzielen.

(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

Diese Lösung schränkt das Ausmaß der Nebenwirkungen ein.

Andernfalls gibt es (define x (box 5)), (unbox x), usw., wie in einem Unterkommentar von Eli erwähnt, was der von erjiang vorgeschlagenen Lösung entspricht.

0voto

mathk Punkte 7683

Sie haben wahrscheinlich zu viel C, PHP oder was auch immer verwendet. In einem Schema willst du keine Sachen wie pass-by-* machen. Verstehen Sie zuerst, was Scope bedeutet und wie sich die verschiedenen Implementierungen verhalten (versuchen Sie insbesondere herauszufinden, was der Unterschied zwischen LISP und Scheme ist).

Eine rein funktionale Programmiersprache hat dem Wesen nach keine Nebeneffekte. Folglich bedeutet dies, dass pass-by-ref kein funktionales Konzept ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X