Frage

Ich hätte gerne eine Version von lambda, angerufen lambda-r, von innen heraus kannst du return.Ein Beispiel:

(+ ((lambda-r ()
    (return 1)
    2)) 5)

Dies würde den Wert ergeben 6.Obwohl Sie vielleicht erwarten, dass der Wert 7 ist, ist er 6, da 1 vom Lambda-Ausdruck zurückgegeben wird, bevor 2 erreicht wird.

Hier ist ein Beispiel für die Art von Transformation, nach der ich suche.Nehmen wir an, man würde es verwenden lambda-r wie folgt:

(lambda-r (a b)
    (return a)
    (+ a b))

Ich möchte, dass es so umgewandelt wird:

(call/cc (lambda (k)
       (define return (lambda (v)
                        (k (lambda (a b)
                             v))))
       (lambda (a b)
         (return a)
         (+ a b))))

Das könnte auch mit einem Let-Ausdruck anstelle einer internen Definition ausgedrückt werden, ich verwende jedoch der Klarheit halber die Definition.

Beachten Sie, dass der obige Code tatsächlich wie erwartet funktioniert. Das Problem ist, dass ich Schwierigkeiten habe, mich auszudrücken lambda-r Als ein Makro.Der Grund ist, dass ich will k Und v aus hygienischen Gründen, aber ich möchte nicht return hygienisch sein.

Mein Makro ist derzeit folgendes:

(define-syntax lambda-r
  (syntax-rules (return)
    [(_ (var ...) body ...)
     (call/cc (lambda (k)
           (define return (lambda (v)
                            (k (lambda (var ...)
                                 v))))
           (lambda (var ...)
             body ...)))
     ]))

Was nicht funktioniert, weil return wird hygienisch behandelt und ist daher bei der Anwendung nicht direkt sichtbar lambda-r.Also (lambda-r () (return 1)) gibt einen Fehler aus, der das besagt return ist kein gültiger Bezeichner.


Bearbeiten:Dank der Antwort von Nathan Sanders bin ich näher dran zu verstehen, was ich hier tun muss.Allerdings verstehe ich die folgenden Vorgehensweisen nicht vollständig und konnte sie daher noch nicht zum Laufen bringen.Ich wäre Ihnen sehr dankbar, wenn Sie mir Ressourcen erläutern bzw. verweisen könnten, die Folgendes erklären:

  • Die syntax Verfahren
  • Die datum->syntax/syntax->datum Verfahren

Bearbeiten:Egal – ich habe es jetzt :)

War es hilfreich?

Lösung

Was Sie wollen, ist syntax-case anstatt syntax-rules.

Die R6RS-Definition gibt insbesondere einige Beispiele ein Abschnitt über Syntax-Objekt- und Datumskonvertierungen, was Sie wollen.Sie sollten in der Lage sein, das anzupassen loop w/ break Beispiel zu Ihrem return.

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