lua-users home
lua-l archive

Re: Globals in 5.0 Alpha

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Edgar Toernig wrote:
Powerful it may be, but with the complexity I dare to disagree ;-)
It's even more obscure than the previous global statement *g*
I don't agree that it's obscure. Anyway, now that Lua has banished tag methods, inspired from your Sol work, we have room for a little new complexity :-). Especially when it's useful.
 1) You no longer have one "global" table but a lot of them. The
 term "global" becomes a little bit strange.
It's not so bad. Instead of thinking of "global" to mean the outermost scope or a specific table, I think of it to mean the way I access the variable. In other words, global accesses are those to undeclared variables, and I may want to map such accesses to a certain table. If you insist that "global" must mean the very outer scope, why not also say that "local" should mean only the innermost scope?
 2) The global-table is attached to Lua functions. You are no longer
 able to switch to another "global" table. You have to explicitely
 change each and every function (hard/impossible to do).
I don't quite follow the problem here. It's easy to group functions that you would like to share scope within a function or chunk.
 3) It introduces a hard to track dynamic binding. It's impossible to
 tell which object is accessed by an identifier. The binding is
 done dynamically at a later point (even while a function is active).
It looks like a feature to me. Writing a chunk with exported variables as globals and then being able to control binding according to the application is very powerful. The old global statement was too static-- a problem, especially since Lua lack's a macro system.
IMHO, even
 local val
 mod_table = {}
 function mod_table.foo(x) val=x end
 function mod_table.bar(x) print(val) end
is easier to understand than these global table tricks.
What you're not showing is bar calling foo (in other words, code with countless references to mod_table). You're neglecting that to prevent global name clashes and get the best performance, you have to make mod_table local and return it to the caller.
Anway, nothing prevents you from continuing to write in that style.
-John
--
http:// i . /

AltStyle によって変換されたページ (->オリジナル) /