File tree Expand file tree Collapse file tree 1 file changed +83
-0
lines changed Expand file tree Collapse file tree 1 file changed +83
-0
lines changed Original file line number Diff line number Diff line change 1+ package a {
2+
3+ trait Expr [+ T ]
4+ trait QCtx
5+
6+ /* Quote*/ def q [T ](x : T )(given QCtx ): Expr [T ] = ???
7+ /* Splice*/ def s [T ](x : (given QCtx ) => Expr [T ]): T = ???
8+ /* run*/ def r [T ](x : (given QCtx ) => Expr [T ]): T = ???
9+
10+
11+ val test : Any = {
12+
13+ def pow (x : Expr [Double ], n : Int )(given QCtx ): Expr [Double ] =
14+ if n == 0 then q{1.0 } else q{ s{x} * s{pow(x, n - 1 )} }
15+
16+ r {
17+ q{ (x : Double ) => s{pow(q{x}, 5 )} }
18+ }
19+
20+ r {
21+ q{ (x : Double ) =>
22+ s{
23+ val y = q{x}
24+ pow(q{s{y}}, 5 )
25+ }
26+ }
27+ }
28+
29+ r {
30+ var escaped : Expr [Any ] = null
31+ q{ (x : Double ) =>
32+ s{
33+ escaped = q{x} // 💥
34+ pow(q{x}, 5 )
35+ }
36+ }
37+ }
38+ }
39+
40+ }
41+
42+
43+ package b {
44+
45+ trait QCtx {
46+ type Expr [+ T ]
47+ }
48+
49+ /* Quote*/ def q [T ](x : T )(given qctx : QCtx ): qctx.Expr [T ] = ???
50+ /* Splice*/ def s [T ](given qctx0 : QCtx )(x : (given qctx : QCtx { type Expr [+ T ] >: qctx0.Expr [T ] }) => qctx.Expr [T ]): T = ???
51+ /* run*/ def r [T ](x : (given qctx : QCtx ) => qctx.Expr [T ]): T = ???
52+
53+
54+ val test : Any = {
55+
56+ def pow (given qctx : QCtx )(x : qctx.Expr [Double ], n : Int ): qctx.Expr [Double ] =
57+ if n == 0 then q{1.0 } else q{ s{x} * s{pow(x, n - 1 )} }
58+
59+ r {
60+ q{ (x : Double ) => s{pow(q{x}, 5 )} }
61+ }
62+
63+ r {
64+ q{ (x : Double ) =>
65+ s{
66+ val y = q{x}
67+ pow(q{s{y}}, 5 )
68+ }
69+ }
70+ }
71+
72+ r { (given qctx ) =>
73+ var escaped : qctx.Expr [Double ] = ???
74+ q{ (x : Double ) =>
75+ s{
76+ escaped = q{x} // error
77+ pow(q{x}, 5 )
78+ }
79+ }
80+ }
81+ }
82+
83+ }
You can’t perform that action at this time.
0 commit comments