Frage

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

Ein Beispiel für die 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?

Andere Tipps

Wie Jari sagte, möchten Sie normalerweise vermeiden, im Schema einen Verweis zu geben, da dies darauf hindeutet, dass Sie Nebenwirkungen missbrauchen.

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

(cons 5 (void))

wird eine Box mit 5 produzieren.Wenn Sie dieses Feld an eine Prozedur übergeben, die die 5 in eine 6 ändert, enthält Ihre Originalbox auch eine 6.Natürlich müssen Sie daran denken cons und car wenn es angebracht ist.

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

Sie können ein Makro verwenden:

generasacodicetagpre.

lambda!

generasacodicetagpre.

jari hat recht, es ist etwas unbestatter, zumindest mit Variablen Bezug genommen.Das gewünschte Verhalten wird jedoch verwendet, und ermutigt sich oft in einem ähnlichen Zeitpunkt in einem ähnlichen Zeitpunkt, indem sie Schließungen verwenden. Seiten 181 und182 (Google Bücher) in der gewürzten Schema machen einen besseren Job, dann kann ich es erklären.

Hier ist eine Referenz, die ein Makro ergibt, mit dem Sie eine C-Syntax-Syntax verwenden können, um "Mit Bezug genommen".OLEGS SITE ist eine Goldmine für interessante Reads, also sorgen Sie dafür, dass Sie es buchen, wenn Sie es nicht schon haben.

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

Sie können einen äußeren Kontext von innerhalb einer in diesem äußeren Kontext definierten Funktion beeinflussen, was Ihnen den Einfluss auf die Passage von Referenzvariablen gibt, d. H. Funktionen mit Nebenwirkungen.

generasacodicetagpre.

Diese Lösung begrenzt den Umfang der Nebenwirkungen.

Andernfalls gibt es (Definieren von X (Box 5)), (UNBOX x) usw., wie in einem Unterteilung von ELI erwähnt, der die von Erjiang vorgeschlagene Cons-Lösung entspricht.

Sie haben wahrscheinlich zu viel von C, PHP oder was auch immer verwendet. Im Schema wollen Sie nicht wie Pass-by-* tun. Verstehen Sie zuerst, welchen Geltungsbereich bedeutet und wie sich die unterschiedliche Implementierung verhält (insbesondere versucht, herauszufinden, was der Unterschied zwischen Lisp und Schema ist).

durch Essenz Eine rein funktionelle Programmiersprache hat keinen Nebeneffekt.Daher bedeutet es, dass Pass-by-REF kein funktionales Konzept ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top