Bạn sẽ sử dụng bộ như thế nào! trong một thủ tục đơn giản f như vậy mà đánh giá (+ (f 0) (f 1)) sẽ trả về 0 nếu các đối số đến + được đánh giá từ trái sang phải nhưng sẽ trả về 1 nếu các đối số được đánh giá từ phải sang trái?Cách sử dụng thiết lập! trong các chức năng Đề án?
5
A
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.