[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: setfenv
- From: "D Burgess" <db@...>
- Date: Tue, 14 Oct 2003 8:3:49 +1000
So, can you answer the question of how one can implement
the following:
while cond do
(re)set initial global environment
luafnc()
end
The aim is that luafnc() cannot modify the the global
environment. I (maybe incorrectly) assumed that the
purpose of setfenv() was provide this functionality
without needing to perform a deep copy of the
GLOBALSINDEX table.
+++++++++++++++++++++++++++++++++
>lhf escribió:
>
>>>I am struggling a little with the following code
>>>
>>> local g={}
>>> setfenv(0,setmetatable(g, {__index=_G}))
>>> ...
>>> for k,v in pairs(g) do print(k,v) end
>
>>> lua5: t3.lua:9: attempt to call a nil value
>
>> The problem is that g does not contain a function called "next", which
>"pairs"
>> needs. You'll have to add it by hand:
>> local g={next=next}
>
>Actually, the problem is that setfenv is changing the "global" or "C"
>environment
>table. IMHO, that *should not be permitted* from inside a Lua script.
>
>> The reason why "next" is not found when "pairs" is called is that
>"pairs" does
>> a lua_rawget for "next" and so avoids the _index metamethod. Perhaps
>"pairs"
>> should use lua_gettable instead of lua_rawget.
>
>Or perhaps "pairs" should not rely on the global "next". If "next" were an
>upvalue
>to "pairs", then the only thing that would change would be that a script
>which
>wanted to redefine "next" would have to also redefine "pairs" and this
>would not
>automatically be picked up by the "for" statement. On the other hand, the
>use of
>iteration "for" statements with implicit "pairs" is deprecated, as I
>understand it.
>In any event, it would have worked as the author intended, in this
>example.
>
>I think it is cleaner if the C environment is reserved for use by C
>functions.
>Then you do not have to worry about not including "next". However, if you
>are
>going to change the global environment, you probably need to worry about
>the
>following:
>
>next ipairs __pow tostring print _TRACEBACK
>
>unless I'm forgetting something. Some of these only matter to the
>standalone
>interpreter.
>
>Rici.