Suggestions
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: Suggestions
 
- From: "Peter Hill" <corwin@...>
 
- Date: 2002年12月27日 21:21:18 -0000
 
- SUGGESTIONS -
(1) "#!" in FILE vs CHUNK
It is stated that, to allow Lua to be conveniently used for shell scripts,
Lua ignores the first line of a CHUNK if it starts with "#".
(a) It seems more appropriate to me that it should ignore the first line of
a FILE only, not a chunk (Ie, the processing is a part of "dofile /
loadfile" rather than chunk execution), since only files relate to script
execution.
(b) Scripts actually start with "#!" not "#", so perhaps that should be used
instead. That would retain the symbol "#" for general use, allowing the
option of it being used in later editions of Lua if desired (though not, of
course, in the sequence of "#" then "!").
(2) (EXP) TRUNCATION
I find the current "(function call)" truncation to a single value to be
rather non-intuitive. While not syntactically ambiguous, to the casual user
it seems odd that the "(,,)" in a function call "f (a,b,c)" doesn't
truncate while an expression usage such as "f((a,b,c))" does.
Perhaps it would be clearer just to define a standard library function
"one()":
 function one(a) return a end
so that one would simply say "a,b,c = x(), y(), one(z())"
(3) "," AS A BINARY FUNCTION
As a syntax note, rather than "(x,y,z)" being some special operation, I'd
prefer "," to simply be treated as a binary function just like "+ - * / <=
etc". In this mode:
(a) It takes N left and M right arguments, and returns 1+M return values, so
 f() , g()
is the same as
 one(f()) , g()
(b) It has a lower precedence that "+", so:
 a,b = 1+2 , 3+4
behaves as the expected:
 a,b = (1+2) , (3+4)
(c) It is right associative, so:
 f(), g(), h(), i()
is equivalent to
 f() , (g(), (h() , i()) )
This means, in essence, that "," takes an arbitrary number of return values
from the right-most function and repetitvely prepends single values to the
front of that return value list from each preceeding function in turn.
(4) GLOBAL [exp]=exp
Consider:
 t = {x=123, ["y"]=456}
Normal global variables are basically an assignment to a global table, eg:
 x = 123
It would be consistent, then, to allow:
 ["y"] = 456
Would that cause any syntax problems? I don't know... I haven't checked yet.
But computationally it makes sense! :-)
(5) AND/OR MULTI-RETURN
"and" and "or" should probably return multiple arguments (since they are in
essence being used to replace the "bool ? exp1 : exp2" functionality of C.
Ie, since I can say:
 if t[i] then
 return i,t[i]
 else
 return nil
 end
then it makes sense to be able to say:
 return t[i] and (i,t[i]) or nil
Of course the current "(exp)" truncation to a single return value kibitzes
that. But then that syntax is already rather shaky and I'd like to see it go
:-).
Alternately, Lua should have a true "a ? b : c" operation.
(6) Want INEXT
Rather than
 for i,v in pair(t) do ... end
I prefer the more explicit form:
 for i,v in next,t do ... end
Likewise for:
 for i,v in ipair(t) do ... end
I'd prefer to say:
 for i,v in inext,t do ... end
However "inext()" doesn't exist.
I could write it of course:
 function inext(t,i)
 i = i and i+1 or 1
 if t[i] then return i,t[i] else return nil end
 end
But it seems to me that "inext()", being as far as I can tell more
fundamental than "ipair()", is more deserving of a place in the basic
library.
(7) VERSION
Should version be only returned as a string? It would seem more appropriate
(and easier to manipulate) to have a version function such as:
 name, major, minor, bugfix = version()
Or perhaps:
 name, major_dot_minor, bugfix = version()
*cheers*
Peter Hill.