It's not intuitive that these two blobs of code have different token costs, even though they do exactly the same thing:
local a = 1 -- 3 tokens: a, =, 1 local b -- 1 token: b b = 1 -- +3 tokens b, =, 1 -> total 4 tokens |
I think the disconnect here is that the b
in local b
is being treated in the cost analysis as a variable reference, which it isn't, because the variable isn't referenced or assigned. It's just forward-declaring a conceptual attribute of the variable (its name), like the zero-cost local
keyword does (its scope).
The reason why this bothers me is that I often find myself doing stupid stuff so I can do tuple assignments to save a token, which makes my code ugly. Gross stuff like re-using existing vars or function args, rather than declaring a new local, so I can put them all on the same tuple-assigning line without having to split out a new token-stealing "local" declaration that wouldn't work inline with the tuple assignment.
Here's a really-contrived example you'd never actually write, but hey, I need an example:
function if_period_at_start_move_to_end( s ) assert(#s >= 2) local p -- this forward declaration is necessary p, s = s[1], sub(s, 2) -- because we can't mix declare-assign with re-assign here if p == "." then -- put it where it should be s = s..p else -- phew it wasn't a period, put it back s = p..s end return s end |
Granted I could simply use two new vars when I take the potential period off of the front of the string, thereby allowing myself to merge the local
declaration into the tuple assignment, but I guess that just feels like stack clutter to me. I know, nit-picky, but still... it's the little things.
Anyway, unless there's some reason why it would be bad to nix the cost of an empty declaration, would this be an acceptable tweak? I did try to think of some harm or abuse that could come of being able to forward-declare a bazillion locals for free, but the only problem I could see would be in the head of the author who did it.
And, like... at heart, the argument is just that local a = 1
and local a; a = 1
are functionally identical, which I'd hope would be enough in the first place. The rest of the above is just me trying even harder to make a case which I think is already made.
Since this isn't in 0.2.5e, I'm gonna guess this either didn't get seen or you don't like the idea. Could I get a confirm on not liking the idea? I won't argue, I just want to know if I should forget about this proposal.
[Please log in to post a comment]