Siehe Ссылка Frage "Gibt es eine Möglichkeit, Call-by-Reference zu emulieren?".
Im Allgemeinen denke ich, dass dies gegen die funktionale Natur des Schemas kämpft, also gibt es wahrscheinlich eine bessere Möglichkeit, das Programm so zu strukturieren, dass es schemenhafter wird.
Wie Jari sagte, normalerweise möchten Sie vermeiden, dass Sie durch Verweis in Schema gehen, da es vorschlägt, dass Sie Nebenwirkungen missbrauchen.
Wenn Sie möchten, können Sie jedoch alles, was Sie als Referenz übergeben möchten, in eine cons
Box einfügen.
erzeugt eine Box mit 5. Wenn Sie diese Box an eine Prozedur übergeben, die die 5 zu einer 6 ändert, enthält Ihre Originalbox auch eine 6. Natürlich müssen Sie daran denken, cons
und car
wenn angebracht.
Chez Scheme (und möglicherweise andere Implementierungen) hat eine Prozedur namens box
(und seine Begleiter box?
und unbox
) speziell für diesen Boxing / Unboxing-Unsinn: Ссылка
Jari hat recht, es ist etwas unschemäßig, zumindest mit Variablen durch Verweis zu gehen. Das Verhalten, das Sie wollen, wird jedoch immer häufiger in einem ähnlichen Schema verwendet und oft durch die Verwendung von Schließungen unterstützt. Seiten 181 und 182 (google books) im alten Schema machen einen besseren Job, als ich es erklären kann.
Hier ist ein Verweis, der ein Makro gibt, das es Ihnen ermöglicht, eine c-ähnliche Syntax zu verwenden, um "als Verweis zu übergeben". Olegs Website ist eine Goldgrube für interessante liest, so stellen Sie sicher, dass Sie es markieren, wenn Sie noch nicht haben.
Sie können einen äußeren Kontext innerhalb einer Funktion beeinflussen, die in diesem äußeren Kontext definiert ist. Dadurch erhalten Sie die Wirkung von Variablen, die sich übergeben lassen, d. h. Funktionen mit Nebeneffekten.
%Vor%Diese Lösung begrenzt den Umfang der Nebenwirkungen.
Ansonsten gibt es (definieren x (Box 5)), (unbox x) usw., wie in einem Unterkommentar von Eli erwähnt, das ist die gleiche wie die von erjiang vorgeschlagene Lösung.
Sie haben wahrscheinlich zu viel von C, PHP oder was auch immer verwendet. In Schema wollen Sie nicht Dinge wie Pass-by-* tun. Verstehen Sie zunächst, welchen Umfang und wie sich die verschiedenen Implementierungen verhalten (versuchen Sie insbesondere herauszufinden, was der Unterschied zwischen LISP und Scheme ist).
Im Wesentlichen hat eine rein funktionale Programmiersprache keine Nebenwirkung. Folglich ist Pass-by-Ref kein funktionaler Begriff.
Tags und Links scheme pass-by-reference r6rs return-by-reference