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?

12voto

Jari Punkte 2144

Véase http://community.schemewiki.org/?scheme-faq-language Frage "Gibt es eine Möglichkeit, Call-by-Reference zu emulieren?".

Im Allgemeinen denke ich, dass dies der funktionalen Natur des Schemas zuwiderläuft, so dass es wahrscheinlich einen besseren Weg gibt, das Programm zu strukturieren, um es schemaähnlicher zu machen.

4voto

erjiang Punkte 42668

Wie Jari sagte, in der Regel möchten Sie die Übergabe durch Verweis in Scheme vermeiden, da es darauf hindeutet, dass Sie Seiteneffekte missbrauchen.

Wenn Sie möchten, können Sie jedoch alles, was Sie als Referenz übergeben möchten, in eine cons Box.

(cons 5 (void))

ergibt eine Schachtel mit 5. Wenn Sie diese Box an eine Prozedur übergeben, die die 5 in eine 6 ändert, enthält Ihre ursprüngliche Box ebenfalls eine 6. Natürlich müssen Sie daran denken cons y car wenn es angebracht ist.

Chez Scheme (und möglicherweise andere Implementierungen) hat eine Prozedur namens box (und seine Begleiter box? y unbox ) speziell für diesen Boxen/Unboxen-Unsinn: http://www.scheme.com/csug8/objects.html#./objects:s43

4voto

gcbenison Punkte 11225

Sie können ein Makro verwenden:

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

2voto

grettke Punkte 1417

Lambda!

(define (foo getx setx)
  (setx (+ (getx) 5)))

(define y 2)
(display y)(newline)

(foo
 (lambda () y)
 (lambda (val) (set! y val)))

(display y)(newline)

2voto

Davorak Punkte 7192

Jari hat Recht, dass es etwas unschematisch ist, per Referenz zu übergeben, zumindest bei Variablen. Allerdings ist das Verhalten, das Sie wollen, verwendet, und oft ermutigt, die ganze Zeit in einem mehr Schema wie Weise durch die Verwendung von Schließungen. [Seiten 181 und 182](http://books.google.com/books?id=vKIvIXSxcCgC&lpg=PP1&dq=little%20schemer&pg=PA181#v=snippet&q=(define%20box&f=false) (google books) in dem bewährten Schema besser erklären als ich es kann.

Hier ist ein Verweis auf ein Makro, das es Ihnen ermöglicht, eine C-ähnliche Syntax zur 'Übergabe durch Referenz' zu verwenden. Olegs Website ist eine Fundgrube für interessante Lektüre, also merken Sie sie sich vor, wenn Sie es noch nicht getan haben.

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

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