मैं सहमत नहीं हूं कि reset
के भीतर यह कोड shift
के बिना मृत है। दरअसल reset
सिर्फ एक निरंतरता की सीमाओं को परिभाषित करता है (ऐसा इसलिए है क्योंकि उन्हें निरंतरता कहा जाता है)। यदि आपके पास shift
reset
के भीतर कहीं भी है तो आप मर जाएंगे और आप निरंतरता समारोह को कॉल नहीं करते हैं। उदाहरण के लिए:
reset {
println(1)
shift((k: Unit => Unit) => println(2))
println(3)
}
कोड shift
के बाद मृत (println(3)
) क्योंकि मैं k(Unit)
बुलाया नहीं किया है।
दूसरी ओर, ऐसा लगता है कि reset
अपने शरीर से कुछ विशेष रिटर्न प्रकार की अपेक्षा करता है - जो @cpsParam
एनोटेशन के साथ एनोटेटेड है। आप reset
विधि की परिभाषा की जाँच कर सकते हैं:
def reset[A,C](ctx: => (A @cpsParam[A,C])): C = ...
और shift
पैदा करता है सिर्फ तुम क्या reset
विधि की उम्मीद है। यहाँ shift
विधि की परिभाषा है:
def shift[A,B,C](fun: (A => B) => C): A @cpsParam[B,C] = ...
लेकिन आप अभी भी यह भीतर shift
कॉल बिना reset
उपयोग कर सकते हैं। इस चाल यह करना होगा:
def foo[T](body: => T @cps[Any]) = reset(body)
foo {
println("it works")
}
कृपया ध्यान दें कि @cps
सिर्फ @cpsParam
के लिए उर्फ टाइप कर रहा है। यहां इसकी परिभाषा है:
type cps[A] = cpsParam[A, A]