Wie würden Sie Set verwenden! in einer einfachen Prozedur f so, dass das Auswerten (+ (f 0) (f 1)) 0 zurückgibt, wenn die Argumente von + von links nach rechts ausgewertet werden, aber 1 zurückgibt, wenn die Argumente von rechts nach links ausgewertet werden?So verwenden Sie Set! in Schema Funktionen?
5
A
Antwort
6
Am einfachsten ist es wahrscheinlich, einen externen Zustand zu speichern und die Implementierung von f beeinflussen seinen Inhalt.
(define x 0)
(define (f n) (let ((tmp x)) (set! x n) tmp))
So x anfänglich 0 und jeder Aufruf f den aktuellen Wert von x zurückzukehren und das Argument als neuer Wert von x zu speichern. Somit wird (f 0) gefolgt von (f 1) beide 0 zurückgeben und den endgültigen x-Wert von 1 belassen. Während die Auswertung (f 1) gefolgt von (f 0) 0 ergibt, dann 1, mit einem endgültigen x von 0.
-1
Mit call/cc.
(define (f)
(call/cc
(lambda (c) (+ (c 0) (c 1)))))
(write (f))
innerhalb jeden Arguments +
Ursachen Aufrufe c f
unmittelbar zurückzukehren, wodurch man 0 oder 1 je nachdem, welche zuerst Argument ausgewertet wird.
Aber ich vermute, es wird immer von links nach rechts ausgewertet und somit 0 zurückgeben.