Scheme-by-Referenz

8

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

Ein Beispiel für die Funktionalität, die ich möchte:

%Vor%

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

    
Cam 16.07.2010, 05:17
quelle

7 Antworten

10

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.

    
Jari 16.07.2010, 05:33
quelle
3

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.

%Vor%

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: Ссылка

    
erjiang 16.07.2010 05:40
quelle
2

Lambda!

%Vor%     
grettke 16.07.2010 15:52
quelle
2

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.

Ссылка

    
Davorak 16.07.2010 20:17
quelle
1

Sie können ein Makro verwenden:

%Vor%     
gcbenison 25.01.2012 05:01
quelle
1

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.

    
user3446498 29.10.2014 07:09
quelle
0

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.

    
mathk 16.07.2010 11:43
quelle