Frage

ich Fortsetzungen lerne, aber ich kann meinen Kopf nicht umschlingen diesen Code. Warum geht es in Endlosschleife?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
War es hilfreich?

Lösung

Zeile für Zeile:

  • definieren wir lokale Variable cont
  • nennen wir mit aktuellen Fortsetzung einige Lambda-Funktion, das heißt, wir die aktuelle Fortsetzung der Lambda-Funktion als Argument sind vorbei. Aktuelle Fortsetzung ist eine Funktion von 1 Argumente, dieses Argument dann als „Rückgabewert“ von call/cc verwendet wird (und hier wird schließlich ignoriert).
  • So k hier alles bedeutet, dass nach geschehen wird, in unserem Fall etwas in der Nähe in Sinne (lambda (call/cc-retval) (let () call/cc-retval (cont #f))). Wir setzen cont Wert auf diese Fortsetzung. call/cc kehrt zurück.
  • Da cont ist jetzt eine Funktion, die die Fortsetzung dargestellt, und es ist Argument der „Rückgabewert von Call / cc“ ist, nennen wir nur diese Funktion, wird das Argument ignoriert, und wir müssen wieder die (cont #f) nennen.

So, was wir bekommen schließlich ist Endlosschleife.

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