Re: val initialization semantic is counterintuitive
Sofoklis Papasofokli <[email protected]> Fri, 9 Sep 2016 16:42:31 -0700 (PDT)
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <[email protected]> |
------=_Part_3127_377845181.1473464551506
Content-Type: multipart/alternative;
boundary="----=_Part_3128_1959844349.1473464551506"
------=_Part_3128_1959844349.1473464551506
Content-Type: text/plain; charset=UTF-8
Hi,
Strange that nobody commented on this one for so long.
I know its an old thread but i keep getting issues from this, I also
believe there should be a compiler error in this situation, its totally
unexpected behavior.
Best Regards,
Sofoklis
On Tuesday, March 22, 2011 at 5:14:16 PM UTC+2, Eugen Labun wrote:
>
> Hi all,
>
> eventually (or even surely) this is an old question but I haven't found an
> explanation for this
> simple situation (nor in Language Specification, nor in Scala-Book).
>
> (More complicated cases are described in this excellent faq from Paul:
> https://github.com/paulp/scala-faq/wiki/Initialization-Order)
>
>
> Constructions like
>
> def m {
> val x = y // compile error "forward reference extends over definition
> of value x"
> val y = 5
> }
>
> cause a compile error if used in methods,
> but are accepted in constructors/initializers:
>
> class/object T {
> val x = y // compiles OK, x = 0
> val y = 5
> }
>
> The 'x' in the code above gets initialized to 0 (!), not to 5.
>
>
> Both -- acceptance by the compiler and initialization to 0 -- are
> counterintuitive to me.
> Would a compile error for the second case ("illegal forward reference")
> not be a more preferable?
>
>
> I'm aware of '-Xcheckinit' compiler option. But this introduces only
> *runtime* check and doesn't
> prevent the code to compile.
>
>
> There was a ticket https://lampsvn.epfl.ch/trac/scala/ticket/399, but
> it's closed. I cannot
> understand the reason of closing (it cites one more example of such
> counterintuitive behavior but
> doesn't explain why this behavior can't be changed).
>
>
> Java handles a semantically analogous situation as expected:
>
> class C {
> final int a = 3;
> {
> System.out.println("a: " + a); // OK
> System.out.println("y: " + y); // Error: illegal forward reference
> }
> final int x = y; // Error: illegal forward reference
> final int y = 5;
>
> public static void main(String[] args) {
> // final int x = y; // Error: cannot find symbol variable y
> final int y = 5;
> }
> }
>
>
> I understand that Scala vals do not map 1:1 to Java final variables, and
> that generating bytecode
> from Scala code is much more complicated (having in mind such things as
> unified access principle and
> therefore introducing methods for vals/vars, mapping of Scala's primary
> constructor to constructors
> and initializers in Java, inheritance and overriding val->def->var, ...)
>
> But, despite how complicated can be the generated code, hopefully, might
> it be possible to detect
> such forward references in Scala parser and generate an error?
>
>
> --
> Regards,
> Eugen
>
>
--
You received this message because you are subscribed to the Google Groups "scala-language" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.
------=_Part_3128_1959844349.1473464551506
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Hi,<br><br>Strange that nobody commented on this one for s=
o long. <br><br>I know its an old thread but i keep getting issues from thi=
s, I also believe there should be a compiler error in this situation, its t=
otally unexpected behavior.<br><br>Best Regards,<br>Sofoklis<br><br>On Tues=
day, March 22, 2011 at 5:14:16 PM UTC+2, Eugen Labun wrote:<blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #c=
cc solid;padding-left: 1ex;">Hi all,<p>eventually (or even surely) this is =
an old question but I haven't found an explanation for this<br>simple s=
ituation (nor in Language Specification, nor in Scala-Book).</p><p>(More co=
mplicated cases are described in this excellent faq from Paul:<br><a href=
=3D"https://github.com/paulp/scala-faq/wiki/Initialization-Order" target=3D=
"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'https://www.googl=
e.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpaulp%2Fscala-faq%2Fwiki%2FInitia=
lization-Order\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFbDzgtf0NkRirePwBhH-=
zUPHp_5g';return true;" onclick=3D"this.href=3D'https://www.google.=
com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpaulp%2Fscala-faq%2Fwiki%2FInitiali=
zation-Order\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFbDzgtf0NkRirePwBhH-zU=
PHp_5g';return true;">https://github.com/paulp/<wbr>scala-faq/wiki/Init=
ialization-<wbr>Order</a>)</p><p><br>Constructions like</p><p>=C2=A0 def m =
{<br>=C2=A0 =C2=A0 val x =3D y // compile error "forward reference ext=
ends over definition of value x"<br>=C2=A0 =C2=A0 val y =3D 5<br>=C2=
=A0 }</p><p>cause a compile error if used in methods,<br>but are accepted i=
n constructors/initializers:</p><p>=C2=A0 class/object T {<br>=C2=A0 =C2=A0=
val x =3D y // compiles OK, x =3D 0<br>=C2=A0 =C2=A0 val y =3D 5<br>=C2=A0=
}</p><p>The 'x' in the code above gets initialized to 0 (!), not t=
o 5.</p><p><br>Both -- acceptance by the compiler and initialization to 0 -=
- are counterintuitive to me.<br>Would a compile error for the second case =
("illegal forward reference") not be a more preferable?</p><p><br=
>I'm aware of '-Xcheckinit' compiler option. But this introduce=
s only *runtime* check and doesn't<br>prevent the code to compile.</p><=
p><br>There was a ticket <a href=3D"https://lampsvn.epfl.ch/trac/scala/tick=
et/399" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'=
https://www.google.com/url?q\x3dhttps%3A%2F%2Flampsvn.epfl.ch%2Ftrac%2Fscal=
a%2Fticket%2F399\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEwMKOcC4BAK6vxRdDN=
CzY6ARwrgA';return true;" onclick=3D"this.href=3D'https://www.googl=
e.com/url?q\x3dhttps%3A%2F%2Flampsvn.epfl.ch%2Ftrac%2Fscala%2Fticket%2F399\=
x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEwMKOcC4BAK6vxRdDNCzY6ARwrgA';r=
eturn true;">https://lampsvn.epfl.ch/trac/<wbr>scala/ticket/399</a>, but it=
's closed. I cannot<br>understand the reason of closing (it cites one m=
ore example of such counterintuitive behavior but<br>doesn't explain wh=
y this behavior can't be changed).</p><p><br>Java handles a semanticall=
y analogous situation as expected:</p><p>=C2=A0 class C {<br>=C2=A0 =C2=A0 =
final int a =3D 3;<br>=C2=A0 =C2=A0 {<br>=C2=A0 =C2=A0 =C2=A0 System.out.pr=
intln("a: " + a); // OK<br>=C2=A0 =C2=A0 =C2=A0 System.out.printl=
n("y: " + y); // Error: illegal forward reference<br>=C2=A0 =C2=
=A0 }<br>=C2=A0 =C2=A0 final int x =3D y; =C2=A0// Error: illegal forward r=
eference<br>=C2=A0 =C2=A0 final int y =3D 5;</p><p>=C2=A0 =C2=A0 public sta=
tic void main(String[] args) {<br>=C2=A0 =C2=A0 =C2=A0 // final int x =3D y=
; // Error: cannot find symbol variable y<br>=C2=A0 =C2=A0 =C2=A0 final int=
y =3D 5;<br>=C2=A0 =C2=A0 }<br>=C2=A0 }</p><p><br>I understand that Scala =
vals do not map 1:1 to Java final variables, and that generating bytecode<b=
r>from Scala code is much more complicated (having in mind such things as u=
nified access principle and<br>therefore introducing methods for vals/vars,=
mapping of Scala's primary constructor to constructors<br>and initiali=
zers in Java, inheritance and overriding val->def->var, ...)</p><p>Bu=
t, despite how complicated can be the generated code, hopefully, might it b=
e possible to detect<br>such forward references in Scala parser and generat=
e an error?</p><p><br>--<br>Regards,<br>Eugen<br></p><p></p><p></p><p></p><=
p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p=
><p></p></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;scala-language" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:[email protected]">scal=
[email protected]</a>.<br />
For more options, visit <a href=3D"https://groups.google.com/d/optout">http=
s://groups.google.com/d/optout</a>.<br />
------=_Part_3128_1959844349.1473464551506--
------=_Part_3127_377845181.1473464551506--