Register to post in forums, or Log in to your existing account
 

Play RetroMUD
Post new topic  Reply to topic     Home » Forums » CMUD General Discussion
Yetzederixx
Beginner


Joined: 19 Oct 2010
Posts: 14
Location: Sulphur, LA

PostPosted: Wed Oct 27, 2010 5:31 am   

Function Return Values in Lua
 
I wrote a function today because I couldn't figure out how %ismember searched through the variables. So I defaulted my lists to alphabetical and adopted a binary search method. It always returned true, well I thought it was, because in the trigger that calls the function the true always sent the true commands. Well after some testing it wasn't the code that was wrong as #echo @FN would echo true/false as appropriate. When you want to return true/false you have to do so by returning 1 or 0 if you are using zScript to test the return value, at least this is how I got it to work.

Code:

--Param 1: Name of character to search for
--Param 2: String list to search in

maxE = table.maxn(zs.param(2))
low  = 1 --Lua starts it's arrays at 1 not 0
high = maxE

while low < high do
  mid = math.floor(low + ((high - low) / 2))
 
  if zs.param(2)[mid] < zs.param(1) then
    low = mid + 1
  else
    high = mid
  end
end

if ((low < maxE) and (zs.param(2)[low] == zs.param(1))) then
  return 1
else
  return 0
end


Here's a snippit of the zScript that uses the the function

Code:
#switch (@binIsMember(%1, @BlackRobes)) {#cw 96}
Reply with quote
Zugg
MASTER


Joined: 25 Sep 2000
Posts: 23379
Location: Colorado, USA

PostPosted: Wed Oct 27, 2010 4:58 pm   
 
Yes, functions always need a return result. Are you reporting a problem, or just letting people know?

The %ismember function in zScript will be faster than your Lua function. %ismember does a fast hash-table lookup, which will be faster than a binary search method and is independent of the list sort method. At least in v3.31. You didn't mention what version of CMUD you are using. In the older 2.37 the %ismember was much slower.
Reply with quote
Yetzederixx
Beginner


Joined: 19 Oct 2010
Posts: 14
Location: Sulphur, LA

PostPosted: Wed Oct 27, 2010 8:50 pm   
 
Initially I had it return true or false, actually it was:

Code:
 return ((low < maxE) and (zs.param(2)[low] == zs.param(1)))


In the zScript would always read it as a return value of true no matter what, even when testing with a known false value. When I would #echo @binIsMember(char, var) it would echo the appropriate respose of true or false. So I guess I'm sort of reporting a bug, or at least something to be aware of.

Reguardless it was still a good exercise in working with Lua, and I got to read a bunch of good helpfiles reguardless, thanks for the input.[/code]
Reply with quote
Zugg
MASTER


Joined: 25 Sep 2000
Posts: 23379
Location: Colorado, USA

PostPosted: Thu Oct 28, 2010 10:49 pm   
 
Hmm, interesting. The true/false boolean return should have worked too. Looks like maybe an issue with the Lua boolean values not being converted to the zScript 0/1 values. I'll add that to the bug list.
Reply with quote
Display posts from previous:   
Post new topic   Reply to topic     Home » Forums » CMUD General Discussion All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© 2009 Zugg Software. Hosted by Wolfpaw.net