2008-11-19 17 views

Odpowiedz

6

Najprostszym podejściem jest prawdopodobnie zachowanie jakiegoś zewnętrznego stanu i wdrożenie f wpływa na jego zawartość.

(define x 0) 
(define (f n) (let ((tmp x)) (set! x n) tmp)) 

Zatem x początkowo 0 i każde wywołanie f powróci bieżącą wartość x i zapisać argument jako nowej wartości x. Tak więc (f 0), po którym następuje (f 1), obie zwrócą 0, pozostawiając końcową wartość x równą 1. Podczas oceniania (f 1), a następnie (f 0), da się 0, a następnie 1, z końcową wartością x wynoszącą 0.

-1

Z call/cc.

(define (f) 
    (call/cc 
    (lambda (c) (+ (c 0) (c 1))))) 

(write (f)) 

Wywoływanie C w ciągu jednej argumentu +f powoduje natychmiastowy powrót otrzymując 0 lub 1 zależnie od tego jaki jest oceniany pierwszym argumentem.

Ale podejrzewam, że zawsze oceni to od lewej do prawej, a tym samym zwróci 0.