Re: Re: val initialization semantic is counterintuitive

Adriaan Moors <[email protected]> Sun, 11 Sep 2016 08:37:41 +0000
Newsgroups gmane.comp.lang.scala
Message-ID <CA+cgcwYTEnnSJg6eJohc1XGRVLD4wL1VJTxTrKdeOV+axe6R1A@mail.gmail.com>
--001a114439c0930ace053c374be1
Content-Type: text/plain; charset=UTF-8

Val initialization is confusing, I agree, but note that you do get a
warning. I'm a bit concerned about making this an error as you could
override `val x` in a subclass (it's still weird, but should it be an
error?).

Welcome to Scala 2.12.0-RC1 (Java HotSpot(TM) 64-Bit Server VM, Java
1.8.0_102).
Type in expressions for evaluation. Or try :help.

scala> class T {
     |   val x = y // compiles OK, x = 0
     |   val y = 5
     | }
*<console>:12: warning: Reference to uninitialized value y*
         val x = y // compiles OK, x = 0
                 ^

On Sat, Sep 10, 2016 at 10:44 PM martin odersky <[email protected]> wrote:

> I think that's a suggestion worth considering! In general it is extremely
> hard to detect uninitialized fields statically. But a scheme of disallowing
> direct forward references is easy to do and catches the most obvious bugs.
>
> Cheers
>
>  - Martin
>
>
>
> On Sat, Sep 10, 2016 at 1:42 AM, Sofoklis Papasofokli <
> [email protected]> wrote:
>
>> 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.
>>
>
>
>
> --
>
> Martin Odersky
> EPFL and Lightbend
>
> --
> 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.
>

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

--001a114439c0930ace053c374be1
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Val initialization is confusing, I agree, but note th=
at you do get a warning. I&#39;m a bit concerned about making this an error=
 as you could override `val x` in a subclass (it&#39;s still weird, but sho=
uld it be an error?).</div><div><font face=3D"monospace"><br></font></div><=
div><font face=3D"monospace">Welcome to Scala 2.12.0-RC1 (Java HotSpot(TM) =
64-Bit Server VM, Java 1.8.0_102).</font></div><div><font face=3D"monospace=
">Type in expressions for evaluation. Or try :help.</font></div><div><font =
face=3D"monospace"><br></font></div><div><font face=3D"monospace">scala&gt;=
 class T {</font></div><div><font face=3D"monospace">=C2=A0 =C2=A0 =C2=A0| =
=C2=A0 val x =3D y // compiles OK, x =3D 0</font></div><div><font face=3D"m=
onospace">=C2=A0 =C2=A0 =C2=A0| =C2=A0 val y =3D 5</font></div><div><font f=
ace=3D"monospace">=C2=A0 =C2=A0 =C2=A0| }</font></div><div><font face=3D"mo=
nospace"><b>&lt;console&gt;:12: warning: Reference to uninitialized value y=
</b></font></div><div><font face=3D"monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0val x =3D y // compiles OK, x =3D 0</font></div><div><font face=3D"mo=
nospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^</f=
ont></div></div><br><div class=3D"gmail_quote"><div dir=3D"ltr">On Sat, Sep=
 10, 2016 at 10:44 PM martin odersky &lt;<a href=3D"mailto:[email protected]=
m">[email protected]</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quo=
te" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr">I think that&#39;s a suggestion worth considering! In gen=
eral it is extremely hard to detect uninitialized fields statically. But a =
scheme of disallowing direct forward references is easy to do and catches t=
he most obvious bugs.=C2=A0<div><br></div><div>Cheers</div><div><br></div><=
div>=C2=A0- Martin<br><div><br></div><div><br></div></div></div><div class=
=3D"gmail_extra"></div><div class=3D"gmail_extra"><br><div class=3D"gmail_q=
uote">On Sat, Sep 10, 2016 at 1:42 AM, Sofoklis Papasofokli <span dir=3D"lt=
r">&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">sofoklis24=
@gmail.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr">Hi,<br><br>Strange that nobody commented on this one for so long. =
<br><br>I know its an old thread but i keep getting issues from this, I als=
o believe there should be a compiler error in this situation, its totally u=
nexpected behavior.<br><br>Best Regards,<br>Sofoklis<br><br>On Tuesday, Mar=
ch 22, 2011 at 5:14:16 PM UTC+2, Eugen Labun wrote:<blockquote class=3D"gma=
il_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pa=
dding-left:1ex">Hi all,<p>eventually (or even surely) this is an old questi=
on but I haven&#39;t found an explanation for this<br>simple situation (nor=
 in Language Specification, nor in Scala-Book).</p><p>(More complicated cas=
es are described in this excellent faq from Paul:<br><a href=3D"https://git=
hub.com/paulp/scala-faq/wiki/Initialization-Order" rel=3D"nofollow" target=
=3D"_blank">https://github.com/paulp/scala-faq/wiki/Initialization-Order</a=
>)</p><p><br>Constructions like</p><p>=C2=A0 def m {<br>=C2=A0 =C2=A0 val x=
 =3D y // compile error &quot;forward reference extends over definition of =
value x&quot;<br>=C2=A0 =C2=A0 val y =3D 5<br>=C2=A0 }</p><p>cause a compil=
e error if used in methods,<br>but are accepted in constructors/initializer=
s:</p><p>=C2=A0 class/object T {<br>=C2=A0 =C2=A0 val x =3D y // compiles O=
K, x =3D 0<br>=C2=A0 =C2=A0 val y =3D 5<br>=C2=A0 }</p><p>The &#39;x&#39; i=
n the code above gets initialized to 0 (!), not to 5.</p><p><br>Both -- acc=
eptance by the compiler and initialization to 0 -- are counterintuitive to =
me.<br>Would a compile error for the second case (&quot;illegal forward ref=
erence&quot;) not be a more preferable?</p><p><br>I&#39;m aware of &#39;-Xc=
heckinit&#39; compiler option. But this introduces only *runtime* check and=
 doesn&#39;t<br>prevent the code to compile.</p><p><br>There was a ticket <=
a href=3D"https://lampsvn.epfl.ch/trac/scala/ticket/399" rel=3D"nofollow" t=
arget=3D"_blank">https://lampsvn.epfl.ch/trac/scala/ticket/399</a>, but it&=
#39;s closed. I cannot<br>understand the reason of closing (it cites one mo=
re example of such counterintuitive behavior but<br>doesn&#39;t explain why=
 this behavior can&#39;t be changed).</p><p><br>Java handles a semantically=
 analogous situation as expected:</p><p>=C2=A0 class C {<br>=C2=A0 =C2=A0 f=
inal int a =3D 3;<br>=C2=A0 =C2=A0 {<br>=C2=A0 =C2=A0 =C2=A0 System.out.pri=
ntln(&quot;a: &quot; + a); // OK<br>=C2=A0 =C2=A0 =C2=A0 System.out.println=
(&quot;y: &quot; + 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 refe=
rence<br>=C2=A0 =C2=A0 final int y =3D 5;</p><p>=C2=A0 =C2=A0 public static=
 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 val=
s do not map 1:1 to Java final variables, and that generating bytecode<br>f=
rom Scala code is much more complicated (having in mind such things as unif=
ied access principle and<br>therefore introducing methods for vals/vars, ma=
pping of Scala&#39;s primary constructor to constructors<br>and initializer=
s in Java, inheritance and overriding val-&gt;def-&gt;var, ...)</p><p>But, =
despite how complicated can be the generated code, hopefully, might it be p=
ossible to detect<br>such forward references in Scala parser and generate a=
n error?</p><p><br><span><font color=3D"#888888">--<br>Regards,<br>Eugen<br=
></font></span></p><span><font color=3D"#888888"><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></font></span></blockquote></div><span><font color=3D"#888888">

<p></p>

-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;scala-language&quot; group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:[email protected]" targ=
et=3D"_blank">[email protected]</a>.<br>
For more options, visit <a href=3D"https://groups.google.com/d/optout" targ=
et=3D"_blank">https://groups.google.com/d/optout</a>.<br>
</font></span></blockquote></div><br><br clear=3D"all"><div><br></div></div=
><div class=3D"gmail_extra">-- <br><div data-smartmail=3D"gmail_signature">=
<br>Martin Odersky<br>EPFL and Lightbend</div>
</div>

<p></p>

-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;scala-language&quot; group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:[email protected]" targ=
et=3D"_blank">[email protected]</a>.<br>
For more options, visit <a href=3D"https://groups.google.com/d/optout" targ=
et=3D"_blank">https://groups.google.com/d/optout</a>.<br>
</blockquote></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;scala-language&quot; 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 />

--001a114439c0930ace053c374be1--