1+ import language .experimental .captureChecking
2+ import caps .*
3+
4+ class Console extends SharedCapability :
5+ def println (msg : String ): Unit = Predef .println(" CONSOLE: " + msg)
6+
7+ class IO extends SharedCapability :
8+ def readLine (): String = scala.io.StdIn .readLine()
9+
10+ class Clazz (val console : Console ^ ):
11+ val io : IO ^ = IO ()
12+ lazy val memberLazy : () -> {io} String = {
13+ console.println(" Computing memberLazy" )
14+ () => " Member Lazy Value" + io.readLine()
15+ }
16+
17+ def client (c : Clazz ^ ): Unit =
18+ val io : IO ^ = IO ()
19+ trait Trait :
20+ lazy val memberLazy : () -> {io} String
21+ def memberMethod (): String
22+
23+ val t : Trait ^ = ???
24+
25+ lazy val funky = t.memberLazy() + c.memberLazy()
26+
27+ lazy val anotherFunky =
28+ c.console.println(" Computing anotherFunky" )
29+ t.memberLazy
30+
31+ val v0 : () -> () -> {io} String = () => t.memberLazy // error
32+ val v0_1 : () -> {t} () -> {io} String = () => t.memberLazy // ok
33+ val v1 : () -> String = () => t.memberLazy() // error
34+ val v2 : (() -> String )^ {t} = () => t.memberLazy() // ok
35+ val v3 : (() -> String )^ {c.console} = () => c.memberLazy() // error (but should this be allowed?)
36+ val v4 : () -> String = () => t.memberMethod() // error
37+ val v5 : (() -> String )^ {t} = () => t.memberMethod() // ok
38+
39+ val v6 : () -> {c} String = () => funky // error
40+ val v6_1 : () -> {t} String = () => funky // error
41+ val v7 : () -> {c, t} String = () => funky // ok
42+
43+ val v8 : () -> {t, c.console} String = () => anotherFunky() // ok
44+
45+ class Clazz2 (val console : Console ^ ):
46+ val io : IO ^ = IO ()
47+ final lazy val memberLazy : () -> {io} String = {
48+ console.println(" Computing memberLazy" )
49+ () => " Member Lazy Value" + io.readLine()
50+ }
51+
52+ trait Trait2 :
53+ final lazy val memberLazy : () -> {io} String = () => io.readLine()
54+
55+ val c2 : Clazz2 ^ = ???
56+ val t2 : Trait2 ^ = ???
57+
58+ lazy val funky2 = t2.memberLazy() + c2.memberLazy()
59+
60+ val v9 : () -> {c2.memberLazy, t2.memberLazy} String = () => funky2 // error (but should this be allowed?)
61+ val v10 : () -> {t2, c2} String = () => funky2 // ok
62+
63+ ()
0 commit comments