Great advice :) In functional programming, using 'val' is preferred over using 'var'.
For instance, if you do let val x = 0 val x = x + 1 val x = 5 * x in ... end The compiler is very likely to map the three x's to one register as if the code was written in the following imperative style: let var x = 0 val () = x := x + 1 val () = x := 5 * x in ... end On a modern architecture, register allocation is a complicated issue. By using more val's (instead of var's), you allow more freedom during register allocation, potentially resulting in the generation of more efficient object code. On Thu, Jul 16, 2020 at 2:14 PM <[email protected]> wrote: > Additionally, you might want to use different variables for i. It’s > allowed to use the same variable name in successive let bindings. The > different i will have different types, making it simpler for type checker > to solve constraints. > > Sent from my iPhone > > On 16 Jul 2020, at 19:01, Hongwei Xi <[email protected]> wrote: > > > * >> i := ((if mat4_at(m, 1, 1) > mat4_at(m, 0, 0) then 1 else i):int);* > *>> i := ((if mat4_at(m, 2, 2) > mat4_at(m, $showtype(i), i) then 2 else > i):int); // <-- this line has the error* > > 'i' is later used to index an array. > It seems that you just need: > > i := ((if mat4_at(m, 1, 1) > mat4_at(m, 0, 0) then 1 else i):natLt(2)); > i := ((if mat4_at(m, 2, 2) > mat4_at(m, $showtype(i), i) then 2 else > i):natLt(3); > > > On Thu, Jul 16, 2020 at 8:12 AM d4v3y_5c0n3s <[email protected]> wrote: > >> So, I'm trying to mutate a var twice in order to replicate some C code >> that I am trying to port to ATS. But, I've been scratching my head as to >> why this would happen, so any help is appreciated. In an effort to not >> waste your time, I will be showing you the function with my issue along >> with the declarations for the relevant functions & typedefs. Please ask if >> you'd like me to provide more details that I may have missed. >> >> The function I'm having trouble in: >> >> implement mat4_to_quat ( m ) = let >> val tr = m.xx + m.yy + m.zz >> in >> if tr > 0.f then let >> val s = $MATH.sqrt(tr + 1.f) >> val w = s / 2.f >> val x = ( mat4_at(m, 1, 2) - mat4_at(m, 2, 1) ) * (0.5f / s) >> val y = ( mat4_at(m, 2, 0) - mat4_at(m, 0, 2) ) * (0.5f / s) >> val z = ( mat4_at(m, 0, 1) - mat4_at(m, 1, 0) ) * (0.5f / s) >> in >> quat_new(x, y, z, w) >> end else let >> val nxt = @[int](1, 2, 0) >> var q = @[float][4](0.f) >> var i = 0 >> var j = 0 >> var k = 0 >> var s = 0 >> in >> * i := ((if mat4_at(m, 1, 1) > mat4_at(m, 0, 0) then 1 else i):int);* >> * i := ((if mat4_at(m, 2, 2) > mat4_at(m, $showtype(i), i) then 2 else >> i):int); // <-- this line has the error* >> j := nxt[i]; >> k := nxt[j]; >> s := $MATH.sqrt( (mat4_at(m, i, i) - (mat4_at(m, j, j), mat4_at(m, k, >> k))) + 1.f ); >> q[i] := s * 0.5f; >> s := (if (s != 0.f) then 0.5f / s else s); >> q[3] := (mat4_at(m, j, k) - mat4_at(m, k, j)) * s; >> q[j] := (mat4_at(m, i, j) + mat4_at(m, j, i)) * s; >> q[k] := (mat4_at(m, i, k) + mat4_at(m, k, i)) * s; >> quat_new(q[0], q[1], q[2], q[3]) >> end >> end >> >> >> Here's the function's declaration: >> >> fun mat4_to_quat ( m: mat4 ) : quat = "sta#%" >> >> >> Here's the declaration for mat4_at: >> >> fun mat4_at {x:nat | x < 4}{y:nat | y < 4} ( m: mat4, x: int x, y: int y >> ) : float = "sta#%" >> >> >> My full repo can be found here: >> https://github.com/d4v3y5c0n3s/Goldelish-Engine >> Here's the error message: >> >> patscc -tcats /home/d4v3y/Goldelish-Engine/source/g_engine.dats >> **SHOWTYPE[UP]**(/home/d4v3y/Goldelish-Engine/source/g_engine.dats: >> 35508(line=1373, offs=55) -- 35509(line=1373, offs=56)): >> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)): S2RTbas(S2RTBASimp(1; >> t@ype)) >> /home/d4v3y/Goldelish-Engine/source/g_engine.dats: 35508(line=1373, >> offs=55) -- 35509(line=1373, offs=56): error(3): the dynamic expression >> cannot be assigned the type [S2Eapp(S2Ecst(g1int_int_t0ype); >> S2Eextkind(atstype_int), S2EVar(6368))]. >> /home/d4v3y/Goldelish-Engine/source/g_engine.dats: 35508(line=1373, >> offs=55) -- 35509(line=1373, offs=56): error(3): mismatch of static terms >> (tyleq): >> The actual term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)) >> The needed term is: S2Eapp(S2Ecst(g1int_int_t0ype); >> S2Eextkind(atstype_int), S2EVar(6368)) >> /home/d4v3y/Goldelish-Engine/source/g_engine.dats: 35512(line=1373, >> offs=59) -- 35513(line=1373, offs=60): error(3): the dynamic expression >> cannot be assigned the type [S2Eapp(S2Ecst(g1int_int_t0ype); >> S2Eextkind(atstype_int), S2EVar(6369))]. >> /home/d4v3y/Goldelish-Engine/source/g_engine.dats: 35512(line=1373, >> offs=59) -- 35513(line=1373, offs=60): error(3): mismatch of static terms >> (tyleq): >> The actual term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)) >> The needed term is: S2Eapp(S2Ecst(g1int_int_t0ype); >> S2Eextkind(atstype_int), S2EVar(6369)) >> >> | >> >> -- >> You received this message because you are subscribed to the Google Groups >> "ats-lang-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/ats-lang-users/32da2a64-1760-418e-8d45-1960f16f13d5o%40googlegroups.com >> <https://groups.google.com/d/msgid/ats-lang-users/32da2a64-1760-418e-8d45-1960f16f13d5o%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > You received this message because you are subscribed to the Google Groups > "ats-lang-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ats-lang-users/CAPPSPLqDLKzw8QZHUNeGoNqBGHJTQnzp6Gd0S0DAK%3Dy81BSpKQ%40mail.gmail.com > <https://groups.google.com/d/msgid/ats-lang-users/CAPPSPLqDLKzw8QZHUNeGoNqBGHJTQnzp6Gd0S0DAK%3Dy81BSpKQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > -- > You received this message because you are subscribed to the Google Groups > "ats-lang-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ats-lang-users/BB1AE44F-6247-41B3-8358-13E0A4DCC5FD%40gmail.com > <https://groups.google.com/d/msgid/ats-lang-users/BB1AE44F-6247-41B3-8358-13E0A4DCC5FD%40gmail.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "ats-lang-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/CAPPSPLpv76RuShAbr3WRbDXs_WNJxUyTG9Nn-xuGyZC_tiG%2BJw%40mail.gmail.com.
