2008-11-19 3 views

Trả lời

6

Cách tiếp cận dễ nhất có thể là lưu trữ một số trạng thái bên ngoài và thực hiện f ảnh hưởng đến nội dung của nó.

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

Vì vậy, x ban đầu là 0 và mỗi cuộc gọi đến f sẽ trả về giá trị hiện tại của x và lưu đối số dưới dạng giá trị mới của x. Như vậy (f 0) theo sau bởi (f 1) cả hai sẽ trả về 0, để lại giá trị x cuối cùng của 1. Trong khi đánh giá (f 1) theo sau bởi (f 0) sẽ mang lại 0 thì 1, với x cuối cùng là 0,

-1

Với call/cc.

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

(write (f)) 

Gọi c trong vòng hai lập luận để + nguyên nhân f trở lại ngay lập tức, năng suất 0 hoặc 1 tùy mà tranh luận được đánh giá đầu tiên.

Nhưng tôi nghi ngờ nó sẽ luôn luôn đánh giá từ trái sang phải và do đó trả về 0.