Re: [ANN] Lua 5.3.0 (work1) now available
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: Re: [ANN] Lua 5.3.0 (work1) now available
- From: Philipp Janda <siffiejoe@...>
- Date: 2013年7月10日 11:14:07 +0200
Am 09.07.2013 23:54 schröbte Lorenzo Donati:
I must agree with you. Although I don't need bitops so much, I find them
useful from time to time. What I really hate is functional notation for
them: any time you try to do little-more-than-trivial stuff you end up
with ugly code (from a readability POV).
Infix notation is really a must for writing readable, straightforward
code using bitops IMHO. I'm not particularly fond of C-like operators,
so I wouldn't object to a more luaish keywords-based approach. Moreover
you cannot have exactly the same operators as in C, since ^ is already
taken,
`^` is only taken for numbers, but IMHO it doesn't make much sense to
define bit operations on numbers anyway: "Let's take the number of
apples and xor it with the number of oranges, right shift by the number
of baskets, and we get: total nonsense"! Usually one does arithmetic
_xor_ bit manipulation at any given time[*].
So my suggestion would be: Add a bunch of operators (C-like; if you are
going to write C code in Lua, it should look familiar to C programmers;
also: most obvious candidates for keyword operators are already taken by
bit32) and metamethods, but don't define those for any builtin
datatypes. Instead provide a library that implements bitstrings as
userdata using those new metamethods. Added bonus: you can define
bitstrings of arbitrary length, independent of the size of the integer
datatype.
[*]: The one exception I can think of is implementing hash tables,
where most algorithms do extensive bit fiddling to generate "unexpected"
bit patterns and the result is a bucket index (i.e. a genuine number).
Fortunately we already have those in Lua ...
> On 09/07/2013 20.23, Ico wrote:
>>
>> val = val & ~mask
>>
>> for clearing bits in a word. Doing this with bit32 does not result in
>> code that is more readable, IMHO:
>>
>> val = bit32.band(val, bit32.bnot(mask))
>>
I usually use `val = val - mask` for this, meaning "clear all bits set
in mask from val". I also use `a + b` for `a | b`, and `a( b )` for `!(b
& ~a)` (i.e.: check if the set of one-bits in b is a subset of one-bits
in a). Together with `==` this is enough to implement the common bit
flags in C APIs.
Philipp
- References:
- Re: [ANN] Lua 5.3.0 (work1) now available, Miles Bader
- Re: [ANN] Lua 5.3.0 (work1) now available, Luiz Henrique de Figueiredo
- Re: [ANN] Lua 5.3.0 (work1) now available, Enrico Colombini
- Re: [ANN] Lua 5.3.0 (work1) now available, Roberto Ierusalimschy
- Re: [ANN] Lua 5.3.0 (work1) now available, Lorenzo Donati
- Re: [ANN] Lua 5.3.0 (work1) now available, Roberto Ierusalimschy
- Re: [ANN] Lua 5.3.0 (work1) now available, Lorenzo Donati
- Re: [ANN] Lua 5.3.0 (work1) now available, Joseph Manning
- Re: [ANN] Lua 5.3.0 (work1) now available, Todd Coram
- Re: [ANN] Lua 5.3.0 (work1) now available, Lorenzo Donati
- Re: [ANN] Lua 5.3.0 (work1) now available, Roberto Ierusalimschy
- Re: [ANN] Lua 5.3.0 (work1) now available, Jerome Vuarand
- Re: [ANN] Lua 5.3.0 (work1) now available, Ico
- Re: [ANN] Lua 5.3.0 (work1) now available, Lorenzo Donati