lua-users home
lua-l archive

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


It was thus said that the Great Dirk Laurie once stated:
> 2015-10-19 0:34 GMT+02:00 Soni L. <fakedme@gmail.com>:
> 
> > First of all #{} makes no sense, either you know the size
> > or you should be using select('#') instead.
> 
> If you mean no sane Lua programmer should type that precise
> expression, then I agree. If you mean that # acting on any table
> constructor makes no sense, then I disagree. As Humpty Dumpty
> might have said to Alice: what is #{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}?
> 
> > Second it'd be a lot more useful if #... meant the same as
> > select('#', ...).
> > [skip]
> > ...[n] could mean the same as select(n, ...) (but with an opcode
> > instead of a function, so that it's slightly faster).
> 
> I agree with the spirit of these suggestions. The length operator
> has the right feel.
> 
> `select` is arguably the least elegant function in the standard library.
> There is absolutely no reason why a function call is needed.
> The OP_VARARG instruction at present does not use its `C` field.
> Those nine bits could be exploited to provide the functionality of
> `select`.
> 
> However, there is no need for `...` if we are not calling a function.
> The OP_VARARG instruction knows where the vararg is.
> 
> The following syntax could be used:
> 
>     ##             -- select('#',...)
>     #index      -- select(index,...) when n is an integer
> 
> All that we would need to sacrifice is the __len metamethod when
> its argument is an integer, since then "Lua knows what to do".

  Hmm ...

	function foo(...)
	  local max = select('#',...)
	  
	  for i = 1 , max do
	    print(string.format("Stack: %d %d %s",i,i-max-1,tostring(select(i,...))))
	  end
	end
	
	function bar(...)
	  for i = 1 , ## do
	    print(string.format("Stack: %d %d %s",i,i-##-1,tostring(#i)))
	  end
	end
	
  -spc (I think I like it)