'Tiếp tục' là toàn bộ tương lai của tính toán. Mỗi điểm trong một tính toán có một sự tiếp tục mà, trong điều kiện ngây thơ, bạn có thể nghĩ đến như là ngăn xếp chương trình hiện tại và ngăn xếp hiện tại. Chức năng Đề án call/cc
thuận tiện nắm bắt cấu hình hiện tại và đóng gói nó thành một hàm. Khi bạn gọi hàm đó, bạn quay trở lại điểm đó trong tính toán. Do đó, một sự tiếp nối rất khác với một hàm (nhưng hàm tiếp tục là, một hàm).
Có hai trường hợp phổ biến nơi người ta thường thấy call/cc
áp dụng:
thoát phi địa phương. Bạn thiết lập một sự tiếp tục, làm một số tính toán, để đột ngột kết thúc tính toán bạn gọi sự tiếp tục.
khởi động lại/nhập lại một tính toán. Trong trường hợp này, bạn lưu tiếp tục và sau đó gọi lại lần nữa như bạn muốn.
Dưới đây là một ví dụ cho trường hợp # 1:
(begin
;; do stuff
(call/cc (lambda (k)
;; do more
;; oops, must 'abort'
(k 'ignore)))
;; continue on
)
Và đây là một ví dụ cho trường hợp # 2:
> (define C#f)
> (let ((x 10))
(display (list (+ 1 (call/cc (lambda (k) (set! c k) x))) 111))
(display " more"))
(11 111) more
> (c 20)
(21 111) more
> (c 90)
(91 111) more
Đối với trường hợp này # 2 là nó đáng chú ý là việc tiếp tục đưa bạn trở lại vòng lặp đọc-in-cấp cao nhất - cung cấp cho bạn một cơ hội để gọi lại sự tiếp tục trong ví dụ này!
Bạn không sử dụng 'call/cc' mà đối số * là * lấy phần tiếp theo hiện tại (dưới dạng hàm). Chỉnh sửa câu hỏi của bạn để sử dụng 'call/cc'! Đọc wikipage trên [tiếp tục] (http://en.wikipedia.org/wiki/Continuation) –
Tôi không sử dụng cuộc gọi/cc, tôi đang sử dụng một hàm tương đương đại diện cho việc tiếp tục? – ayhid
Tiếp tục là cú pháp một hàm nhưng nó đại diện cho một chuyển điều khiển. Giao thức cuộc gọi của nó khác với chức năng của nó - nó không bao giờ được trả về. –