2008-11-19 5 views
5

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?

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.