În următoarea declarație, val f
este definit ca un lambda care se referă la sine (este recursiv):
val f: Int => Int = (a: Int) =>
if (a > 10) 3 else f(a + 1) + 1 // just some simple function
L-am încercat în REPL și se compilează și se execută corect.
Conform specificației, aceasta pare a fi o instanță de referire directă ilegală:
Într-o secvență de instrucțiuni
s[1]...s[n]
care alcătuiește un bloc, dacă un nume simplu îns[i]
se referă la o entitate definită des[j]
undej >= i
, atunci pentru toates[k]
între și inclusivs[i]
șis[j]
,
s[k]
nu poate fi o definiție variabilă.- Dacă
s[k]
este o definiție de valoare, trebuie să fielazy
.
Atribuirea este o singură instrucțiune, deci a îndeplinit criteriile j >= i
și este inclusă în intervalul de instrucțiuni la care se aplică cele două reguli (între și inclusiv s[i]
și s[j]
).
Cu toate acestea, se pare că încalcă a doua regulă, deoarece f
nu este leneș.
Cum este aceasta o declarație legală (a încercat-o în Scala 2.9.2)?