2012-07-05 22 views
5

Xét đoạn mã sau:Tại sao việc tiếp tục không có tính chất hữu ích?

(call-with-values 
    (lambda() 
     (call/cc (lambda (k) 
     (k k k)))) 
    (lambda (x y) 
    (procedure-arity y))) 

Nó khá rõ ràng ở đây là việc tiếp tục tại điểm của call/cc gọi là lambda ở phía bên tay phải, vì vậy arity của nó nên được 2. Tuy nhiên, giá trị trả về của các bên trên (trong vợt) là (arity-at-least 0) thay thế.

Thật vậy, chạy mã tương tự trong Guile (thay thế procedure-minimum-arity cho procedure-arity) cho thấy rằng việc tiếp tục cũng được cho là cho phép bất kỳ số lượng đối số nào, mặc dù nó không rõ ràng.

Vì vậy, tại sao vậy? Theo như tôi hiểu (sửa cho tôi nếu hiểu biết của tôi sai), tính chất của sự tiếp tục là khá đơn giản: nó là 1 ngoại trừ trong bối cảnh call-with-values, trong trường hợp đó là bất cứ điều gì là tính chất của lambda bên phải. (Trong đó, cấp, có thể phức tạp nếu đó là một case-lambda hoặc tương tự, nhưng không có phức tạp hơn nếu bạn đang gọi (procedure-arity (case-lambda ...)) trực tiếp.)

+0

IMO, nó phải là bất kỳ số lượng đối số, như khi việc tiếp tục rõ ràng được tạo ra với cuộc gọi/cc, bối cảnh là chưa biết đến việc tiếp tục được thực sự gọi. Tôi nghĩ rằng định nghĩa của 'giá trị' trong spec (R5/6) tổng hợp này lên độc đáo. – leppie

+0

Tôi không hoàn toàn chắc chắn cách 'các giá trị' ngụ ý rằng sự tiếp tục có tính chất tùy ý. Bạn không được phép trả về một số giá trị khác với những gì mà sự tiếp tục hỗ trợ. :-) Vì vậy, '(+ (giá trị 1 2 3) 42)' không hợp lệ: trong ngữ cảnh này (giả sử 'giá trị' như được định nghĩa trong R5RS), sự tiếp tục tạo ra có 1 số nguyên, không có gì khác. –

+1

Ngoài ra với 'giá trị có cuộc gọi', * người tiêu dùng * xác định vị trí không phải là nhà sản xuất *. – leppie

Trả lời

2

Một cách đơn giản để xem cùng là:

(call-with-values 
    (lambda() (error 'arity "~v" (procedure-arity (call/cc (λ (k) k))))) 
    (lambda (x y) (procedure-arity y))) 

và thậm chí đơn giản hơn:

(procedure-arity (call/cc (λ (x) x))) 

Và trong trường hợp đầu tiên, việc tiếp tục mong đợi hai yếu tố đầu vào, nhưng các trường hợp như vậy không quá phổ biến. Ví dụ, chúng thường là ví dụ như vậy, trong khi "mã thực" sẽ sử dụng define-values hoặc có một số tiếp tục không xác định, trong đó sự tiếp nối mà tạo call/cc có thể có các vị trí khác nhau tùy thuộc vào ngữ cảnh mà chúng được tạo ra. Điều này có nghĩa rằng không có nhiều điểm trong việc cố gắng tìm ra những trường hợp hiếm hoi này, nơi mà sự liên tục được biết đến.

Footnote:

;; nonsensical, but shows the point 
(define (foo) (call/cc (λ (x) x))) 
(define x (foo)) 
(define-values [y z] (foo)) 
+0

Đợi đã, có phải bạn đang nói rằng có những lúc mà tinh thần tiếp tục là _unknown_ tại thời điểm bắt giữ nó? Có lẽ tôi không nghĩ đủ về điều này. –

+0

Vâng, xem chú thích cuối trang. Trừ khi bạn muốn mỗi sự tiếp tục này tự động có được các vị thần khác nhau ... (Nhưng tôi phải chạy, vì vậy không thể dành nhiều thời gian hơn cho điều này ngay bây giờ.) –

+0

Cách tiếp cận năng động thực sự là những gì tôi đã nghĩ khi tôi hỏi câu hỏi , nhưng có lẽ nó không khả thi. Tôi nên cố gắng tạo ra một bằng chứng của khái niệm để xem nếu điều này thậm chí sẽ làm việc. Trong khi đó, có một đánh dấu màu xanh lá cây lớn. Ý tôi là, bạn đã chờ đợi 2 tháng cho nó. :-) –

Các vấn đề liên quan