D - Suggestion: 'bits' property
- Russ Lewis (15/15) May 09 2002 Sometimes you have to get certain bits out of an expression. It's ugly
- Pavel Minayev (4/7) May 09 2002 I like the idea! And since bit arrays are already present in the languag...
- Russ Lewis (13/21) May 09 2002 I wasn't suggesting precisely a bit array (but that might work, see belo...
- Sean L. Palmer (15/33) May 10 2002 I like where this thread is headed. Runtime bitfields!! Maybe this wil...
- Russell Borogove (8/22) May 10 2002 Seconded, thirded, and fourthed.
- OddesE (17/32) May 09 2002 A very interesting idea indeed!
- Russ Lewis (14/20) May 09 2002 We do need to be careful about this - but bit extracting is not very har...
- Russ Lewis (41/47) May 09 2002 This may be a place for GENERICS. There have been a number of places wh...
- Walter (6/16) May 10 2002 It's an intriging idea. I added it to the list of possible 2.0 features.
- Robert W. Cunningham (4/23) May 10 2002 I'd also like to see it on the LHS:
Sometimes you have to get certain bits out of an expression. It's ugly to code...why not make it a property of the variable? That is, add a property that slices certain bits out of an integer (or any type, frankly): int orig = 0x01234567; int field = orig.bits(0,7); // field now equals 0x00000067 field = orig.bits(8,15); // field now equals 0x00000045 Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003 -- The Villagers are Online! villagersonline.com .[ (the fox.(quick,brown)) jumped.over(the dog.lazy) ] .[ (a version.of(English).(precise.more)) is(possible) ] ?[ you want.to(help(develop(it))) ]
May 09 2002
"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003I like the idea! And since bit arrays are already present in the language, it seems even more logical...
May 09 2002
Pavel Minayev wrote:"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...I wasn't suggesting precisely a bit array (but that might work, see below). Technically, it's just a shift, with no cast to a bit array. However, it might not be bad to have the language do implicit casts from bit arrays to integer types...with checks to make sure that the the size is ok: int orig = 0x01234567; bit[] b = orig.bits; int field = b[20..31]; -- The Villagers are Online! villagersonline.com .[ (the fox.(quick,brown)) jumped.over(the dog.lazy) ] .[ (a version.of(English).(precise.more)) is(possible) ] ?[ you want.to(help(develop(it))) ]Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003I like the idea! And since bit arrays are already present in the language, it seems even more logical...
May 09 2002
I like where this thread is headed. Runtime bitfields!! Maybe this will help greatly with writing compression or other bit twiddling routines. It would also be an opportunity for the compiler to gain some information about bit usage, so it could optimize say int a; a.bits(0,15) = short1; a.bits(16,31) = short2; into one 32-bit write; optimize mask operations etc. Sean "Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAE4DA.4B7BA704 deming-os.org...Pavel Minayev wrote:language,"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003I like the idea! And since bit arrays are already present in thebelow).it seems even more logical...I wasn't suggesting precisely a bit array (but that might work, seeTechnically, it's just a shift, with no cast to a bit array. However, it might not be bad to have the language do implicit casts frombitarrays to integer types...with checks to make sure that the the size isok:int orig = 0x01234567; bit[] b = orig.bits; int field = b[20..31];
May 10 2002
Pavel Minayev wrote:"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...Seconded, thirded, and fourthed. ushort pixel; red = pixel.bits[11..15] << 3; green = pixel.bits[ 5..10] << 2; blue = pixel.bits[ 0.. 4] << 3; Far cleaner and clearer than the usual and-masking. -Russell BFrankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003I like the idea! And since bit arrays are already present in the language, it seems even more logical...
May 10 2002
"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...Sometimes you have to get certain bits out of an expression. It's ugly to code...why not make it a property of the variable? That is, add a property that slices certain bits out of an integer (or any type, frankly): int orig = 0x01234567; int field = orig.bits(0,7); // field now equals 0x00000067 field = orig.bits(8,15); // field now equals 0x00000045 Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003 -- The Villagers are Online! villagersonline.com .[ (the fox.(quick,brown)) jumped.over(the dog.lazy) ] .[ (a version.of(English).(precise.more)) is(possible) ] ?[ you want.to(help(develop(it))) ]A very interesting idea indeed! There might be a concern that all these (admittedly super handy) properties might cause code bloat to the language though? If I write a small program and never use the bits property, or the sorting properties of arrays for that matter, will the code associated with these properties still be included in the program? But that aside I like it, and bit extracting code isn't big anyhow. -- Stijn OddesE_XYZ hotmail.com http://OddesE.cjb.net _________________________________________________ Remove _XYZ from my address when replying by mail
May 09 2002
OddesE wrote:There might be a concern that all these (admittedly super handy) properties might cause code bloat to the language though? If I write a small program and never use the bits property, or the sorting properties of arrays for that matter, will the code associated with these properties still be included in the program?We do need to be careful about this - but bit extracting is not very hard. For the record, here is my proposal for the Standard Implementation (tm) of bit shifting: var.bits[n..m] May be implemented as (assuming that 'type' is the type of 'var'): var << (type.size*8-1-m) >>> (type.size*8-1-m+n); At least, I think my math is right here...don't have time to check it too closely. -- The Villagers are Online! villagersonline.com .[ (the fox.(quick,brown)) jumped.over(the dog.lazy) ] .[ (a version.of(English).(precise.more)) is(possible) ] ?[ you want.to(help(develop(it))) ]
May 09 2002
OddesE wrote:There might be a concern that all these (admittedly super handy) properties might cause code bloat to the language though? If I write a small program and never use the bits property, or the sorting properties of arrays for that matter, will the code associated with these properties still be included in the program?This may be a place for GENERICS. There have been a number of places where I (or somebody else) has suggested syntax sugar, and then provided a formula for the expanded code that implements it. If a library of these expansions were available and something that could be either included in the standard library or wrapped into every compiler, then compilers could support fancy syntax sugar while using a standard, cross-compiler implementation of it. So in this theory, generics are not blocks of code like normal functions...they are patterns that expand to code, which the compiler can simply do pattern replacement on. So lemme play with a really ugly first pass at a definition of a generic, inspired by the syntax bison/yacc uses: generic getbits as expression: expression '.' "bits" '[' expression ".." expression ']' { ( ($1) << (($1).type.size*8-1-($5)) >>> (($1).type.size*8-1-($5)+($7))) } ; The idea is that it declares a generic that may be used as an "expression". Other contexts might be generics that could be used as "statements" or other things. To match this generic, you must find a valid expression of some sort, followed by a dot, followed by "bits", followed by the open bracket, followed by a valid expression, the ".." operator, another expression, and finally a closing bracket. You are telling it that that pattern may be replaced with the pattern within the braces. The $1, $5, and $7 tell the compiler to replace those respective elements of the pattern into the expression; thus $1 is the first expression, $5 is the second, and $7 is the last. Problems: * Need to declare associativity. Properties have left-associativity * Need to declare precedence. This should have the same precedenc as other properties. * Need to substitute in $1, $5, $7 by VALUE, not by expression, so that foo.bits[bar() .. baz()] doesn't run bar() or baz() multiple times. Or we need a syntax to use temporary variables. Actually, to solve both the associativity and the precedence issue, it would be cool to be able to declare something "generic x as property", meaning that you're just declaring a new type of property... -- The Villagers are Online! villagersonline.com .[ (the fox.(quick,brown)) jumped.over(the dog.lazy) ] .[ (a version.of(English).(precise.more)) is(possible) ] ?[ you want.to(help(develop(it))) ]
May 09 2002
"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...Sometimes you have to get certain bits out of an expression. It's ugly to code...why not make it a property of the variable? That is, add a property that slices certain bits out of an integer (or any type, frankly): int orig = 0x01234567; int field = orig.bits(0,7); // field now equals 0x00000067 field = orig.bits(8,15); // field now equals 0x00000045 Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003It's an intriging idea. I added it to the list of possible 2.0 features. Basically, I was thinking of altering it to being able to cast a slice of a bit array into an integral type.
May 10 2002
Walter wrote:"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message news:3CDAD769.7A60BB24 deming-os.org...I'd also like to see it on the LHS: SomeHardwareRegister.bits[3..10] |= 0x0F; -BobCSometimes you have to get certain bits out of an expression. It's ugly to code...why not make it a property of the variable? That is, add a property that slices certain bits out of an integer (or any type, frankly): int orig = 0x01234567; int field = orig.bits(0,7); // field now equals 0x00000067 field = orig.bits(8,15); // field now equals 0x00000045 Frankly, if it wouldn't create ambiguity in the compiler, I would like to use syntax like array slicing: field = orig.bits[16..19]; // field now equals 0x00000003It's an intriging idea. I added it to the list of possible 2.0 features. Basically, I was thinking of altering it to being able to cast a slice of a bit array into an integral type.
May 10 2002