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.)
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
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. –
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