Code archives/Miscellaneous/Lua For-Each Function

This code has been declared by its author to be Public Domain code.

Download source code

Lua For-Each Function by Galaxy6132011
I did a lot of hunting down, at first I thought it was too crazy to work, but it does work.

I wanted a easy way to go through a TList object inside of Lua. So I came up with the idea of just passing the TList object, and passing a anonymous function to do for each member. The function will only receive one argument right now, and that's the object. I initially tried having LuGI take care of the BMX function, but it turned out way easier to just register it manually. What I did with the temporary function was put it in a temporary register which each object of the loop can run, then at the end it releases the register.

Please share any improvements you make!

Here's an example of how to use it in Lua:

ForEach(CurrentSystem.PlanetList, 
	function (planet)
		DrawText(planet.Name.." : "..planet.oAngle, SCREENW/2-128, 0+(16*Planet_Count))
		Planet_Count=Planet_Count+1	
	end )

-- Or even clearer:

ForEach(ListObject, 
	function (ListMember)
		--Do operations  here
	end )
''' Put somewhere after you start your LuaState
lua_register( lua_state, "ForEach", ForEach )

''' The actual function

Function ForEach:Int( lua_vm:Byte Ptr )

	Local _arg_1:TList = Null
	
	If lua_gettop(lua_vm) > 1
		_arg_1 = TList(lua_tobmaxobject(lua_vm, 1))
		
		If lua_isfunction(lua_vm,2)
			Local tmpFunc% = luaL_ref(lua_vm, LUA_REGISTRYINDEX)
				
			For Local tmp:Object = EachIn _arg_1
				'call luaFunc
				lua_rawgeti(lua_vm,LUA_REGISTRYINDEX,tmpFunc)
				lua_pushbmaxobject(lua_vm,tmp)
				If lua_pcall( lua_vm, 1, 1, 0 ) Then
						scriptError = lua_tostring( lua_vm, -1 )
						lua_pop( lua_vm, 1 )
						Notify("ForEach :: "+scriptError)
						scriptIsGood = False
				'Else
					' Get the result
					'local result% = lua_tointeger( luaState, -1 )
				EndIf
				lua_pop( lua_vm, 1 )
			Next
			
			luaL_unref(lua_vm,LUA_REGISTRYINDEX,tmpFunc)
		EndIf
	End If

	lua_pushinteger( lua_vm, 0 )

	Return 1

End Function

Comments

Jim Teeuwen2011
By request: http://www.blitzbasic.com/codearcs/codearcs.php?code=2544


Galaxy6132011
Haha, second time I submit something and someone else did it better and proper. xD Well, I guess mine is at least a working case study on how to send a lua function to a BlitzMax function and execute it multiple times...


Code Archives Forum