D - DJournal Tips
- anderson (119/119) Jun 14 2002 Here's an update.
- Matthew Wilson (38/50) Jun 14 2002 Guys
- anderson (10/14) Jun 14 2002 Fine, I'll refer to them as notes from now on, just for clarority. In th...
-
anderson
(13/16)
Jun 14 2002
- anderson (28/28) Jun 14 2002 As to other ideas, perhaps the there could be some kind of competiton, w...
- anderson (159/159) Jun 14 2002 Any suggestions?
- Matthew Wilson (4/5) Jun 14 2002 Can we get it in an .html file? (Am getting sick of opening an html in a...
-
Matthew Wilson
(4/5)
Jun 14 2002
The "When to Optimise" section is all in large-bold (
?) style. Thin...
- Matthew Wilson (193/194) Jun 14 2002 OK, I've fixed the bugs up (included)
- anderson (65/65) Jun 14 2002 charset="iso-8859-1"
- anderson (72/72) Jun 14 2002 boundary="----=_NextPart_001_0070_01C213EB.823F1610"
- Pavel Minayev (23/23) Jun 14 2002 It's an old story... you can only apply operator = to array.length. For
- anderson (776/799) Jun 14 2002 Thanks, I said there are probably code errors ( I haven't had time to te...
- anderson (91/91) Jun 15 2002 boundary="----=_NextPart_001_007C_01C21493.D7570E70"
- Sean L. Palmer (30/30) Jun 15 2002 I would actually like it if the stuff purely about the D Journal website...
- Walter (11/11) Jun 16 2002 charset="iso-8859-1"
- Matthew Wilson (28/28) Jun 17 2002 Joel
- anderson (13/36) Jun 14 2002 Then the following lines in the "Programming in D for C Programmers" mus...
- Walter (7/53) Jun 16 2002 Oops!
- Nic Tiger (22/34) Jun 17 2002 Didn't anyone noticed that the following example is not valid not only f...
- Walter (6/25) Jun 18 2002 You're right. Thanks for catching this egregious error.
- Pavel Minayev (3/15) Jun 18 2002 Isn't subscript expression supposed to be calculated BEFORE the subscrip...
- Nic Tiger (16/31) Jun 18 2002 Посмотрел ASM, который генерируется, и вынужден согласиться.
- Sean L. Palmer (14/33) Jun 18 2002 simply
- anderson (9/9) Jun 18 2002 Yer I was thinking that too. I saw it on th D page and couldn't work out...
- Burton Radons (26/39) Jun 18 2002 No - disinformation sure spreads quickly. Nic was right but for the
- anderson (6/45) Jun 18 2002 Thanks, I learn something!
- Walter (5/7) Jul 06 2002 It's not that unusual. One way to really learn a language is to try and
- anderson (3/11) Jul 06 2002 Well that was my underlining point. You read between the lines GREAT!
- Sean L. Palmer (8/47) Jun 18 2002 Why doesn't D specify what the behavior is for ++ and --, exactly? Why
- Matthew Wilson (6/62) Jun 18 2002 Couldn't agree more.
- Burton Radons (19/22) Jun 20 2002 C and D also don't define the order of subexpression evaluation in
- Walter (3/25) Jul 06 2002 Yes, you're right.
- Sean L. Palmer (18/41) Jun 15 2002 Walter have you considered adding these properties to arrays?
- Walter (11/25) Jun 16 2002 They do add some value, but at the moment I want to err on the side of a
- Sean L. Palmer (10/36) Jun 17 2002 Isn't that gonna make a lot of other writeable properties hard to use? ...
- Walter (5/9) Jun 17 2002 The
- Sean L. Palmer (4/13) Jun 18 2002 So don't put them in.
- Walter (6/12) Jun 18 2002 I wish it were that easy. Compromises are inevitable to satisfy conflict...
- anderson (30/56) Jun 17 2002 I don't agree. Any decent programmer with half a brain would beable to
- Sean L. Palmer (14/22) Jun 17 2002 into
- anderson (12/36) Jun 17 2002 That reminds me of what we used to do in C to speed up malloc/realloc. B...
- Matthew Wilson (13/58) Jun 17 2002 Koenig showed in (can't remember reference) that reallocation by 150% is...
- Sean L. Palmer (50/55) Jun 18 2002 It's not however the best balance of wasted memory (the memory allocated...
- Matthew Wilson (16/72) Jun 18 2002 You sounds to be agreeing violently with me, or is is too late in the da...
- Sean L. Palmer (37/122) Jun 18 2002 I guess I'm only disagreeing about the percentage. 150% of 1 is 1 .. 15...
- Burton Radons (38/43) Jun 17 2002 Python uses a specific function for overallocation that they claim gives...
- Walter (6/49) Jun 17 2002 Check out OutBuffer in the Phobos library, it is tuned for incrementally
- Sean L. Palmer (80/123) Jun 18 2002 This is the reason realloc is not encouraged in C++. With value semanti...
- Walter (9/14) Jun 17 2002 Block
- anderson (5/10) Jun 17 2002 Thanks, I didn't think you'd miss that.
- anderson (23/23) Jun 17 2002 Just a question/thought ...
- Roberto Mariottini (21/35) Jun 17 2002 there's
- Walter (1/1) Jun 18 2002 You're right. I obviously need to make this point clear in the spec.
- anderson (9/9) Jun 18 2002 *sigh*
- Roberto Mariottini (9/18) Jun 19 2002 are
- Pavel Minayev (3/8) Jun 18 2002 Does this mean that ~= also performs a reallocation each time?
- Burton Radons (5/15) Jun 18 2002 Yes, ~= is functionally identical to incrementing the length yourself.
- Sean L. Palmer (11/26) Jun 18 2002 Those are our 3 choices?
- Matthew Wilson (6/33) Jun 18 2002 Agreed. "give it the capacity field" gets my vote
- anderson (8/14) Jun 18 2002 of
- Matthew Wilson (5/22) Jun 18 2002 All sounds a bit inefficient from a performance point of view. :/
- Burton Radons (57/62) Jun 18 2002 As far as I know. Array slices that copy aren't a real option, as:
- anderson (19/26) Jun 18 2002 I also think 50% is to large. It just needs to be tweeked utill a good s...
- Walter (6/10) Jul 07 2002 of
- Walter (6/14) Jul 07 2002 wrote:
- Matthew Wilson (6/30) Jun 17 2002 And couldn't the compiler warn - which warning to be filtered out by
- Walter (8/15) Jun 17 2002 The performance penalty of such a loop can easilly reduce a 2GHz machine...
- Walter (8/22) Jun 17 2002 I see that kind of code all the time, over and over. I saw it again rece...
- Matthew Wilson (6/31) Jun 17 2002 Agree. If they want to do it badly, let them do it longhand
- Sean L. Palmer (25/50) Jun 18 2002 You can't predict exactly how much memory you need alot of the time. Bu...
- Walter (7/10) Jul 08 2002 up
- Pavel Minayev (16/16) Jun 18 2002 On Mon=2C 17 Jun 2002 17=3A43=3A25 -0700 =22Walter=22 =3Cwalter=40digita...
- anderson (36/41) Jun 18 2002 That's a very interesting point!
- Matthew Wilson (18/23) Jun 18 2002 Seems like if we give the arrays a notion of capacity, all these
- Pavel Minayev (5/10) Jun 19 2002 None! An additional int field to store the "actual" size of the array is
- anderson (31/41) Jun 19 2002 There are always reasons against, but probably none worth the advantages
- Patrick Down (18/30) Jun 20 2002 I agree.
- Sean L. Palmer (12/42) Jun 20 2002 I would do the "proxy" approach to slices. Make slices a distinct type ...
- Matthew Wilson (6/53) Jun 20 2002 Yes!
- anderson (7/17) Jun 20 2002 A slice should simply be a constant array as with array sent to a functi...
- anderson (5/7) Jul 08 2002 In other words I ment that the address of a contants array cannot be cha...
- Patrick Down (7/17) Jun 20 2002 I agree. The same thought has occured to be about slices being a
-
Walter
(8/17)
Jul 09 2002
- Burton Radons (55/81) Jul 09 2002 Depending upon the kind of code, of course. Any complex
- Walter (5/13) Jul 09 2002 You're right. I've been intending to add "implementation notes" sprinkle...
- Matthew Wilson (26/26) Jun 14 2002 Joel
- anderson (64/64) Jun 14 2002 charset="iso-8859-1"
- anderson (12/12) Jun 14 2002 charset="iso-8859-1"
Here's an update. Any suggestions? PS I think it would be good to have a contributes section in the DJounal with all authors details (webpage/email). What do you think. For example, heres some of my details Country : Australia Occupation : 3rd Year computer science Uni Student Webpage : www.hohums.tech.nu Email : anderson firestar.com.au (but you already have that) Hobbies : Programming, Programming, 3d graphics programming and D. But I haven't contributed enough to be worthy of that honour yet ;). begin 666 D tips.txt M(&UA:6X =V%Y<R!T;R!D;R!T:&ES+"!T86ME('EO=7( <&EC:RX-" T*"69O M<B H(&EN="!N(#T M(" :6YT(&X /2!M87 M,3L ;CX],#L M"69O<B H(&EN="!N(#T ;6%X.R M+6X^,#L M92!L87)G97( >6]U<B!P<F]G<F%M(&ES+"!T:&4 ;6]R92!M86EN=&5N86YC M92!R97%U:7)E9"X 2722<R!B97-T('1O(')E=7-E(&-O9&4 87, ;75C:"!A M<R!P;W-S:6)L92!B96-A=7-E('1H:7, =VEL;"!R961U8V4 ;6%I;G1E;F%N M8V4O9&5B=6=G:6YG('1I;64N(%-O;65T:6UE<R!O<'1I;6ES871I;VYS(&UE M86X 8G)E86MI;F< =&AI<R!R=6QE+"!B=70 <F5M96UB97( =&AA="!O;FQY M('1H92!C<FET:6-A;"]T:6UE;'D <&%R=', ;V8 =&AE('!R;V=R86T ;F5E M"CQ(,3Y$(&%R<F%Y<R!C86X 8F4 <V]R=&5D/"](,3X-" T*"6EN=%M=($$[ M/$ Q/D0 87)R87ES(&-A;B!B92!R97-I>F5D(&]N('1H92!F;'D\+T Q/ T* M/3T 0BD +R]4:&5N(&)O=& 87)E(&5Q=6%L(&EN(&QE;F=T:"!A;F0 :71E M>6]U(&MN;W< =&AA="!T:&5R92!I<R!A($0 ;F5W<V=R;W5P(&]N(&YE=W,N M9&EG:71A;&UA<G,N8V]M('-E<G9E<C\ 2&5R92!Y;W4 8V%N(&%S:R]S=6=G M97-T(&%N>71H:6YG(&%B;W5T($0 86YD(&5V96X =&%L:R!T;R!T:&4 8W)E M(&5X=')A8W0 8V]D92!F<F]M(&AT;6P <&%G97, 86YD(&-O;7!I;&4 :70 M;&EK92!N;W)M86P 8V]D92X (%=H870 87)E('1H92!A9'9A;G1A9V5S(&]F M('1H:7,_($%P87)T(&9R;VT 8F5G:6YN:6YG(&%B;&4 =&\ :V5E<"!C;V1E M('=I=& 9&]C=6UE;G1A=&EO;B!F=71U<F4 1"!)1$62<R!M87D 8F4 86)L M92!T;R!U<V4 =&AI<R!F96%T=7)E(&9O<B!A=71O;6%T:6, <WEN=&%X(&AI M92!A;GD =&EP<R!Y;W4 =V]U;&0 ;&EK92!T;R!S:&%R92P 96UA:6P +2TM M0"TM+2XM+2TN(%1H97D ;75S="!B92!N;R!M;W)E('1H96X 7U]?(&QI;F5S M;B!I<R!T:&4 :V5Y('1O(&=O;V0 <')O9W)A;6UI;F<[(&)U="!I9B!Y;W4 M9&]NDG0 =&\ <')O9W)A;2 H<VEC*2!T:&5N(&AO=R!C86X >6]U(&1E<VEG M;C\-" T*3VX 82!M;W)E('-E<FEO=7, ;F]T92!534P :7, 82!G<F5A="!D M97-I9VYI;F< ;65T:&]D;VQO9WD 9F]R(&]B:F5C="!O<FEE;G1A=&5D(&QA M;F=U86=E<R!L:6ME($0N($AE<F4 87)E('-O;64 ;&EN:W, =&\ 9V5T(&YE M;VYA;"YC;VTO=6UL+VEN9&5X+FIS<)0^4F%T:6]N86R2<R!534P 5V5B<&%G M93PO03X-"CQ!($A2148 /2"3:'1T<#HO+W=W=RYO;6<N;W)G+V=E='1I;F=S M=&%R=&5D+W=H871?:7-?=6UL+FAT;90^26YT<F]D=6-T:6]N('1O($]-1R=S M(%5-3#PO03X-"CQ!($A2148 /2"3:'1T<#HO+W=W=RYS<&%R>'-Y<W1E;7,N M8V]M+F%U+U5-3%]4=71O<FEA;"YH=&V4/D%N;W1H97( 54U,('=E8G!A9V4\ M='D =&5C:&YI8V%L(&%N9"!)DF0 <W5G9V5S="!A('-M86QL(&%M;W5N="!O M9B!P<F]G<F%M;6EN9R!E>'!E<FEE;F-E(&)E9F]R92!A='1E;7!T:6YG('1H M4')O9W)A;7, <VAO=6QD(&)E(&QO=VQY(&-O=7!L960 86YD(&AI9VAL>2!C M<&QI;F<\+T R/ T*4')O9W)A;7, 87)E(&AI9VAL>2!C;W5P;&5D('=H96X M=&AE>2!A<F4 :&5A=FEL>2!R96QI86YT(&]N(&]N92!A;F]T:&5R+B!4:&ES M(&ES(&-O;G-I9&5R960 3D]4($$ 1T]/1"!42$E.1RX 1F]R(&5X86UP;&4 M82!C87( =&AA="!O;FQY('5S97, ;VYE('1Y<&4 ;V8 ='ER92!A;F0 =&AA M="!T>7)E(&]N;'D 8F5I;F< =7-E86)L92!O;B!T:&%T(&-A<BX 26X =&AI M<R!C87-E('1H92!T>7)E(&ES(&YO="!R975S86)L92X 66]U(&-A;I)T('9E M<GD =V5L;"!T86ME('1H92!T>7)E(&%N9"!U<V4 :70 ;VX 86YO=&AE<B!C M87(N($AI9V 8V]U<&QI;F< ;6%K92!P<F]G<F%M<R!L97-S(')E=7-A8FQE M+B -" T*/$ R/D-O:&5S:6]N/"](,CX-"D-O:&5S:6]N(&ES('1H92!W87D M=&AI;F=S('=O<FL =&]G971H97(N(%1A:V4 =&AE(&-A<B!E>&%M<&QE(&%G M86EN+B!3=7!P;W-E('1H92!T>7)E('=A<R!S;R!G96YE<F%L:7-E9"!T:&%T M(&ET(&5V96X =V]R:W, ;VX >6]U<BUN97AT+61O;W(M;F5I9VAB;W5R<R!B M:6QL>6-A<G0N(%1H92!C87( ;6%Y(&)E(')E9'5C960 82!M87AI;75M(&]F M9FEC=6QT('1O(&=E="!T:&4 8F%L86YC92!J=7-T(')I9VAT(&)E='=E96X M=&AE<V4 ='=O(&-O;F-E<'1S(&)U="!J=7-T(&ET(&EN('1H92!B86-K(&]F M('EO=7( ;6EN9"!A;F0 >6]U<B!P<F]G<F%M<R!W:6QL(&)E(&%L;"!T:&4 M8F5T=&5R+B!296UE;6)E<BP :&EG:"!C;VAE<VEO;B!A;F0 ;&]W(&-O=7!L M:6YG(#T 9V]O9"!T:&EN9R!B=70 ;&]W(&-O:&5S:6]N(&%N9"!H:6=H(&-O M=7!L:6YG(#T M86EN('1Y<&5S(&]F(&]P=&EM:7-A=&EO;B!S<&5E9"!A;F0 <VEZ92X 3W!T M:6UI<V%T:6]N(&]N;'D ;F5E9', =&\ 8F4 =7-E9"!W:&5N('1H:6YG<R!H M:&]U;&0 8F4 86X :71E<F%T:79E('!R;V-E<W,N($EN('1H92!D97-I9VX M<W1A9V4 ;W!T:6UI<V%T:6]N('-H;W5L9"!B92!O;B!A(&=L;V)A;"!S8V%L M92X ($%S('1H92!P<F]J96-T('!R;V=R97-S97, 9F]C=7, <VAO=6QD(&YA M8V 87)E(&)O='1L92!N96-K<R H;W!T:6UI<V%T:6]N('!R;V)L96T 87)E M87,I+ T*,RX 07, =&AE('!R;VIE8W0 ;6]V97, 86QO;F< 8V]N=&EN=6%L M;'D ;&]O:R!F;W( ;W!T:6UI<V%T:6]N(&]P<&]R='5N:71I97,N($%S:R!Y M8FQE('1I;64 ;W!T:6UI<VEN9R!T:&ES/R -" D)2&]W('=I;&P =&AI<R!C M:&%N9V4 =&AE(&]V97)A;&P 9&5S:6=N/PT*"0E7:6QL('1H:7, 8VAA;F=E M(&UA:V4 =&AI;F=S(&QO=VQY(&-O:&5S:79E(&]R(&AI9VAL>2!C;W5P;&5D M<F]U<"!S:6UU;&%R(&9U;F-T:6]N<R]T87-K<R!T;V=E=&AE<BX 5&AI<R!W M:6QL(&UE86X ;&5S<R!O<'1I;6ES871I;VXL(&)E8V%U<V4 8V]D92!I<R!M M;W)E(&-E;G1R86QI<V5D+ T*-2X 1&]NDG0 ;W9E<B!O<'1I;6ES92X 268 M=&AE(&-O9&4 ;65E=', :71S(&]P=&EM:7-A=&EO;B!N965D<R H:6X 86QL M(&-A<V5S*2P =&AE;B!I=))S('1I;64 =&\ <W!E;F0 96YE<F=Y(&5L<V5W A:&5R92X-" T*/$D^2F]E;"!!;F1E<G-O;CPO23X-" T* ` end
Jun 14 2002
Guys Just a heads-up on the full-xp of the various types of contributions we'll be seeking for the magazine. Basically, I think there should be the following: 1. Articles: 2000-4000 words. Serious and sophisticated content. Well presented; cogent arguments; correct and explained accompanying code 2. Tips: 400-800 words. Non-trivial (in content, or size, or both). Usually accompanying or embedded code fragments 3. Notes: One-sentence => two-paragraphs and/or small snippets of code (just like Joel's list so far contributed) 4. Opinion pieces. Robert Cunningham did a great off-the-cuff effort the other day on the group, and that's the kind of thing we'll be looking for. I think we'll get Robert to do that one for the first issue, if he'll be so kind. 5. Editorial. A kind of "hello to this month's issue" 6. "A Word From Walter" 7. other things that no-one's thought of yet, and that may be added as the issues go by. I totally confess that I'm borrowing from the excellent Windows Developer's Journal, at least in so far as 1 - 3 are concerned. Although WDJ (now Windows Developer Magazine) no longer has the notes section - which is a shame - it does have Articles, and the Tech Tips section, which I think is an especially useful feature, given the size: they are informative, but never big enough to lose one's attention span. I am certainly looking forward to learning from all you guys via this type of piece especially. Each issue will likely have: 2-4 articles 2-6 tips 5-15 notes 1 or 2 opinion pieces 1 editorial wfw Therefore, Joel, your tips are actually notes, but that's cool. In a couple of days I'll put out a fuller, more detailed, description of all these ideas and then I'll invite everyone's opinion. Matthew "anderson" <anderson firestar.com.au> wrote in message news:aeccv7$2f9b$1 digitaldaemon.com...Here's an update. Any suggestions? PS I think it would be good to have a contributes section in the DJounal with all authors details (webpage/email). What do you think. For example, heres some of my details Country : Australia Occupation : 3rd Year computer science Uni Student Webpage : www.hohums.tech.nu Email : anderson firestar.com.au (but you already have that) Hobbies : Programming, Programming, 3d graphics programming and D. But I haven't contributed enough to be worthy of that honour yet ;).
Jun 14 2002
Fine, I'll refer to them as notes from now on, just for clarority. In the VB mag they were referred to as tips, and came from many different readers of the mag, and were much better and more interesting then mine. I guess I'll be able to make up some better ones once I start using D more often. For example I'm thinking lots of win32 ones, which I haven't done in D yet. Although the term notes doesn't really give them justice. Perhaps the long hand name could be "words of the moment", "chitty chat" or something. "Matthew Wilson" <dmd synesis.com.au> wrote in message news:aecfkm$2huf$1 digitaldaemon.com...Therefore, Joel, your tips are actually notes, but that's cool. In a couple of days I'll put out a fuller, more detailed, description ofallthese ideas and then I'll invite everyone's opinion. Matthew
Jun 14 2002
<snip>In a couple of days I'll put out a fuller, more detailed, description ofallthese ideas and then I'll invite everyone's opinion. Matthew<snip> Just another idea. What about, having a readers comment section at the end of each article where users can comment about that article (and talk to the author). This website does this http://codeguru.earthweb.com/ For example is article http://codeguru.earthweb.com/controls/hotprop.html But I think earthwebs version of this looks kind of ugly. There is probably some way to neaten it up. It's a way of expanding content with little effort.
Jun 14 2002
As to other ideas, perhaps the there could be some kind of competiton, where the best entry gets there tip/note/article (three sections) on tip of the week/word of the week and article of the month on the front page. The article and tip would have to be links, but the note could appear at the bottom of the page. All other notes would be words of the moment, spread across the website. Random ones could be put on other pages (non-article). Furthermore, a related (or lucky dip) note could be placed (like a sticky note) on each article as it's added to the website. The rules for the weekly note competition may go somthing like this. 1. It's up to the judge(s) to decide wether an entry is useful enough to put on the website. 2. Five out of all entries for the current week (that pass 1) will be chosen for the final judging in which only one can win. 3. The winner note/tip will be listed on the front page for one week and then added to the list of winners page. 4. A note may only be summited once and can only win once. 5. In the event that less then five entries are recived in the last week, the remaining best four from the week before will also be included in the final vote. You could have someone like Walter do the final judging or could simply let the users vote the week before. This would provide some more interaction with the users, but it's probably something to thinkabout later. Although once the journal is running, it'd be a great insentive to keep the volunteers up. Parhaps some simular compo could be run to encourage articles for the prototype. For example they could have the first winning article of the week in the first issue. --But that's just a thought
Jun 14 2002
Any suggestions? begin 666 D Notes.txt M(&UA:6X =V%Y<R!T;R!D;R!T:&ES+"!T86ME('EO=7( <&EC:RX-" T*"69O M<B H(&EN="!N(#T M(" :6YT(&X /2!M87 M,3L ;CX],#L M"69O<B H(&EN="!N(#T ;6%X.R M+6X^,#L M92!L87)G97( >6]U<B!P<F]G<F%M(&ES+"!T:&4 ;6]R92!M86EN=&5N86YC M92!R97%U:7)E9"X 2722<R!B97-T('1O(')E=7-E(&-O9&4 87, ;75C:"!A M<R!P;W-S:6)L92!B96-A=7-E('1H:7, =VEL;"!R961U8V4 ;6%I;G1E;F%N M8V4O9&5B=6=G:6YG('1I;64N(%-O;65T:6UE<R!O<'1I;6ES871I;VYS(&UE M86X 8G)E86MI;F< =&AI<R!R=6QE+"!B=70 <F5M96UB97( =&AA="!O;FQY M('1H92!C<FET:6-A;"]T:6UE;'D <&%R=', ;V8 =&AE('!R;V=R86T ;F5E M"CQ(,3Y$(&%R<F%Y<R!C86X 8F4 <V]R=&5D/"](,3X-" T*"6EN=%M=($$[ M/$ Q/D0 87)R87ES(&-A;B!B92!R97-I>F5D(&]N('1H92!F;'D\+T Q/ T* M/3T 0BD +R]4:&5N(&)O=& 87)E(&5Q=6%L(&EN(&QE;F=T:"!A;F0 :71E M>6]U(&MN;W< =&AA="!T:&5R92!I<R!A($0 ;F5W<V=R;W5P(&]N(&YE=W,N M9&EG:71A;&UA<G,N8V]M('-E<G9E<C\ 2&5R92!Y;W4 8V%N(&%S:R]S=6=G M97-T(&%N>71H:6YG(&%B;W5T($0 86YD(&5V96X =&%L:R!T;R!T:&4 8W)E M(&5X=')A8W0 8V]D92!F<F]M(&AT;6P <&%G97, 86YD(&-O;7!I;&4 :70 M;&EK92!N;W)M86P 8V]D92X (%=H870 87)E('1H92!A9'9A;G1A9V5S(&]F M('1H:7,_($%P87)T(&9R;VT 8F5G:6YN:6YG(&%B;&4 =&\ :V5E<"!C;V1E M('=I=& 9&]C=6UE;G1A=&EO;B!F=71U<F4 1"!)1$62<R!M87D 8F4 86)L M92!T;R!U<V4 =&AI<R!F96%T=7)E(&9O<B!A=71O;6%T:6, <WEN=&%X(&AI M=F4 86YY(&YO=&5S('EO=2!W;W5L9"!L:6ME('1O('-H87)E+"!E;6%I;"!- M871H97< 5VEL<V]N(&1M9$!S>6YE<VES+F-O;2YA=2!O<B!*;V5L($%N9&5R M<V]N(&%N9&5R<V]N0&9I<F5S=&%R+F-O;2YA=2X 5&AE>2!M=7-T(&)E(&)E M='=E96X ;VYE+7-E;G1E;F-E(#T^('1W;RUM961I=6TM<&%R86=R87!H<R!A M;F0O;W( <VUA;&P <VYI<'!E=', ;V8 8V]D92X 3W1H97)W:7-E('1H97F2 M;&P 8F4 8V]N<VED97)E9"!F;W( =&AE(&AI;G1S(&%N9"!T:7!S('-E8W1I M:V5Y('1O(&=O;V0 <')O9W)A;6UI;F<[(&)U="!I9B!Y;W4 9&]NDG0 =&\ M<')O9W)A;2 H<VEC*2!T:&5N(&AO=R!C86X >6]U(&1E<VEG;C\-" T*3VX M82!M;W)E('-E<FEO=7, ;F]T92!534P :7, 82!G<F5A="!D97-I9VYI;F< M;65T:&]D;VQO9WD 9F]R(&]B:F5C="!O<FEE;G1A=&5D(&QA;F=U86=E<R!L M:6ME($0N($AE<F4 87)E('-O;64 ;&EN:W, =&\ 9V5T(&YE=V)I99)S('-T M=6UL+VEN9&5X+FIS<)0^4F%T:6]N86R2<R!534P 5V5B<&%G93PO03X-"CQ! M($A2148 /2"3:'1T<#HO+W=W=RYO;6<N;W)G+V=E='1I;F=S=&%R=&5D+W=H M871?:7-?=6UL+FAT;90^26YT<F]D=6-T:6]N('1O($]-1R=S(%5-3#PO03X- M"CQ!($A2148 /2"3:'1T<#HO+W=W=RYS<&%R>'-Y<W1E;7,N8V]M+F%U+U5- M<B!S=6=G97-T:6]N<RD-" T*5&AE(&%B;W9E(&%R92!P<F5T='D =&5C:&YI M8V%L(&%N9"!)DF0 <W5G9V5S="!A('-M86QL(&%M;W5N="!O9B!P<F]G<F%M M<VAO=6QD(&)E(&QO=VQY(&-O=7!L960 86YD(&AI9VAL>2!C;VAE<VEV92X M/ T*4')O9W)A;7, 87)E(&AI9VAL>2!C;W5P;&5D('=H96X =&AE>2!A<F4 M:&5A=FEL>2!R96QI86YT(&]N(&]N92!A;F]T:&5R+B!4:&ES(&ES(&-O;G-I M9&5R960 3D]4($$ 1T]/1"!42$E.1RX 1F]R(&5X86UP;&4 82!C87( =&AA M="!O;FQY('5S97, ;VYE('1Y<&4 ;V8 ='ER92!A;F0 =&AA="!T>7)E(&]N M;'D 8F5I;F< =7-E86)L92!O;B!T:&%T(&-A<BX 26X =&AI<R!C87-E('1H M92!T>7)E(&ES(&YO="!R975S86)L92X 66]U(&-A;I)T('9E<GD =V5L;"!T M86ME('1H92!T>7)E(&%N9"!U<V4 :70 ;VX 86YO=&AE<B!C87(N($AI9V M8V]U<&QI;F< ;6%K92!P<F]G<F%M<R!L97-S(')E=7-A8FQE+B -" T*/$ R M/D-O:&5S:6]N/"](,CX-"D-O:&5S:6]N(&ES('1H92!W87D =&AI;F=S('=O M<FL =&]G971H97(N(%1A:V4 =&AE(&-A<B!E>&%M<&QE(&%G86EN+B!3=7!P M;W-E('1H92!T>7)E('=A<R!S;R!G96YE<F%L:7-E9"!T:&%T(&ET(&5V96X M=V]R:W, ;VX >6]U<BUN97AT+61O;W(M;F5I9VAB;W5R<R!B:6QL>6-A<G0N M3&]W(&-O:&5S:6]N(&UA:V5S(&-O;7!O;F5N=', ;&5S<R!F;&5X:6)L92]E M(&=E="!T:&4 8F%L86YC92!J=7-T(')I9VAT(&)E='=E96X =&AE<V4 ='=O M(&-O;F-E<'1S(&)U="!J=7-T(&ET(&EN('1H92!B86-K(&]F('EO=7( ;6EN M9"!A;F0 >6]U<B!P<F]G<F%M<R!W:6QL(&)E(&%L;"!T:&4 8F5T=&5R+B!2 M96UE;6)E<BP :&EG:"!C;VAE<VEO;B!A;F0 ;&]W(&-O=7!L:6YG(#T 9V]O M9"!T:&EN9R!B=70 ;&]W(&-O:&5S:6]N(&%N9"!H:6=H(&-O=7!L:6YG(#T M:&5N('1O($]P=&EM:7-E/$ Q/ T*5&AE<F4 87)E('1W;R!M86EN('1Y<&5S M(&]F(&]P=&EM:7-A=&EO;B!S<&5E9"!A;F0 <VEZ92X 3W!T:6UI<V%T:6]N M(&]N;'D ;F5E9', =&\ 8F4 =7-E9"!W:&5N('1H:6YG<R!H879E('1O(&)E M86X :71E<F%T:79E('!R;V-E<W,N($EN('1H92!D97-I9VX <W1A9V4 ;W!T M:6UI<V%T:6]N('-H;W5L9"!B92!O;B!A(&=L;V)A;"!S8V%L92X ($%S('1H M+B!&;V-U<R!O;B!T:&4 87)E87, :6X =&AE(&-O9&4 =VAI8V 87)E(&)O M='1L92!N96-K<R H;W!T:6UI<V%T:6]N('!R;V)L96T 87)E87,I+ T*,RX M07, =&AE('!R;VIE8W0 ;6]V97, 86QO;F< 8V]N=&EN=6%L;'D ;&]O:R!F M;W( ;W!T:6UI<V%T:6]N(&]P<&]R='5N:71I97,N($%S:R!Y;W5R<V5L9CH M;W!T:6UI<VEN9R!T:&ES/R -" D)2&]W('=I;&P =&AI<R!C:&%N9V4 =&AE M(&]V97)A;&P 9&5S:6=N/PT*"0E7:6QL('1H:7, 8VAA;F=E(&UA:V4 =&AI M<R!T:&4 <')O:F5C="!D979E;&]P<RP 871T96UP="!T;R!G<F]U<"!S:6UU M;&%R(&9U;F-T:6]N<R]T87-K<R!T;V=E=&AE<BX 5&AI<R!W:6QL(&UE86X M;&5S<R!O<'1I;6ES871I;VXL(&)E8V%U<V4 8V]D92!I<R!M;W)E(&-E;G1R M86QI<V5D+ T*-2X 1&]NDG0 ;W9E<B!O<'1I;6ES92X 268 =&AE(&-O9&4 M;65E=', :71S(&]P=&EM:7-A=&EO;B!N965D<R H:6X 86QL(&-A<V5S*2P M=&AE;B!I=))S('1I;64 =&\ <W!E;F0 96YE<F=Y(&5L<V5W:&5R92X-" T* M8V]M;65N=&EN9R!C;W5L9"!A8W1U86QL>2!S879E('EO=2!T:6UE(&EN('1H M92!L;VYG(')U;BX 3VX =&AE(&]T:&5R(&AA;F0L(&EF('EO=2!B<F5A:R!T M:&EN9W, 9&]W;B!O<B!C;VUM96YT('1O;R!M=6-H(&-O;7!L97AI='D 8F5G M:6YS('1O(')E87( :71S('5G;'D :&5A9"!A9V%I;BX-" T*/$D^2F]E;"!! M;F1E<G-O;CPO23X-" T*/$D^3&]C86QI<V%T:6]N/"])/ T*2V5E<"!E=F5R M>71H:6YG(&QO8V%L:7-E9"X-" T*5&AE(&)E;F5F:71S(&]F(&ME97!I;F< M=&AI;F=S(&QO8V%L:7-E9"!A<F4 ;F]T(&%L=V%Y<R!O8G9I;W5S('1O(&$ M8F5G:6YN97(N(%=H870 :7, ;&]C86QI<V%T:6]N/R!)="!M96%N<R!T;R!K M965P('1H:6YG<R!W:71H:6X =&AE(&9I96QD<R]B;&]C:W, :6X =VAI8V M=&AE>2!A<F4 =7-E9"X 5&AI<R!R=6QE(&1O97, ;F]T(&IU<W0 87!P;'D M=&\ <'5B;&EC+W!R;W1E8W1E9"]P<FEV871E(&)U="!A;'-O('1O('9A<FEA M8FQE<R!W:71H(&)L;V-K<RX 3&]C86QI<V%T:6]N(')E9'5C97, 8V]M<&QE M>&ET>2!B=70 :70 9&]E<R!H;W=E=F5R(&UE86X =&AA="!M;W)E('1H:6YG M"DD :&%D(&$ 9G)I96YD('=H;R!G<F5W('-I8VL ;V8 ='EP:6YG()-I;G24 M(&5V97)Y('1I;64 :&4O<VAE(&UA9&4 82!L;V]P+B!3;R!H92]S:&4 9&5C M:61E9"!I="!W;W5L9"!B92!A(&=O;V0 :61E82!T;R!D96-L87)E()-I;G0 M;I0 87, 82!G;&]B86P *'-O(&5V97)Y(&9U;F-T:6]N(&AA<R!A8V-E<W, M=&\ ;BDN(%5-32XN+B!(87, :&ES+VAE<B!P<F]G<F%M(&=R;W< =&AE()-F M;W( *&X],#L ;CQ-87 [(&XK*RD >X5].Y0 <W1A=&5M96YT(&)E8V]M92!A M=71O;6%T:6,N($QI='1L92!D:60 =&AE>2!R96%L:7-E('1H92!B=6=S(&QE M" T*0V%N('EO=2!S964 =&AE('!O=&5N=&EA;"!B=6< :6X =&AE(&-O9&4 M(&1I9"P :V5E<"!T:&EN9W, <VEM<&QE(&)Y(&QO8V%L:7-I;F< 979E<GET M<R!%=FEL/"])/ T*268 >6]U(&UE;G1I;VX 1T]43R!O;B!J=7-T(&%B;W5T M(&%N>2!P<F]G<F%M;6EN9R!W96)S:71E+"!Y;W62<F4 ;&EK96QY('1O(&=E M="!F;&%M960N($=O=&^2<R!B<F5A:W, =&AE('-T<G5C='5R92]F;&]W(&]F M('1H92!P<F]G<F%M(&%N9"!C;VUP;&EE<G, 9FEN9"!I="!M;W)E(&1I9F9I M<R!J=7-T(&%B;W5T(&%L=V%Y<R!A(&)E='1E<B!W87D =&\ =W)I=&4 <V]M M971H:6YG('=I=&AO=70 =7-I;F< =&AE(&1R96%D960 1T]43R!S=&%T96UE M;G0N("!-86YY(&UO9&5R;B!L86YG=6%G97, 9&]NDG0 979E;B!H879E(&=O M=&\N($%L=&AO=6=H(&%S(%=A;'1E<B HDU!R;V=R86UM:6YG(&EN($0 9F]R M($,M=V%Y(&=O=&\ <W1A=&5M96YT<R!C86X 8F4 96QI;6EN871E9"!W:71H M('1H92!$(&9E871U<F4 ;V8 ;&%B96QL960 8G)E86L 86YD(&-O;G1I;G5E M('-T871E;65N=',N($)U="!$(&ES(&$ <')A8W1I8V%L(&QA;F=U86=E(&9O M<B!P<F%C=&EC86P <')O9W)A;6UE<G, =VAO(&MN;W< =VAE;B!T:&4 <G5L M97, ;F5E9"!T;R!B92!B<F]K96XN(%-O(&]F(&-O=7)S92!$('-U<'!O<G1S ` end
Jun 14 2002
Can we get it in an .html file? (Am getting sick of opening an html in an editor and pasting this stuff in) "anderson" <anderson firestar.com.au> wrote in message news:aeckfv$2mms$1 digitaldaemon.com...Any suggestions?
Jun 14 2002
The "When to Optimise" section is all in large-bold (<h1> ?) style. Think you're missing a terminating </hX> somewhere "anderson" <anderson firestar.com.au> wrote in message news:aeckfv$2mms$1 digitaldaemon.com...Any suggestions?
Jun 14 2002
OK, I've fixed the bugs up (included) My thoughts (editor hat comically hanging off the left brow, so I can watch the South Korea - Portugal game with the right :): 1. Walking backwards in arrays - ok, useful for programming neophytes. Could do with explanation of which is preferred and why 2. Filler - not sure these are terribly useful, unless each is contextualised. The optimisation one is worth saying, however 3. D arrays can be sorted - need to comment on the sort order 4. D arrays can be resized - perfect note 5. Comparing arrays - perfect note 6. D newsgroup - good note (although links will be on the site) 7. HTML embedded code - good note 8. Notes - not necessary. There'll be full info on how to write for us on the magazine site, but good to mention in this file for the moment 9. Which comes first - think this is way too complex a topic to be summed up in a note. What about an article? 10. Cohesion / Coupling - reasonable 11. When to Optimise - should be a Tip. Could be useful as such. You'd need to provide citations for your quotes/statements 12. KISS / KINAS - Again, statements without rationale. Need to back up these philosophical points 13. Localisation - [localisation is often used as an interchangeable term with internationalisation]. What you are talking about is locality-of-reference. Again would be better as a Tip including references 14. goto - Needs some concrete dangers of goto, and also at least one situation where they are useful/necessary Keep em coming. We've got at least 7 out of that lot. In publishing 50% is pretty good, let me tell you (as a battle-scarred weary word-warrior). :) "anderson" <anderson firestar.com.au> wrote in message news:aeckfv$2mms$1 digitaldaemon.com...Any suggestions?begin 666 anderson-tips.html M(&UA:6X =V%Y<R!T;R!D;R!T:&ES+"!T86ME('EO=7( <&EC:RX-" T*"69O M<B H(&EN="!N(#T M(" :6YT(&X /2!M87 M,3L ;CX],#L M"69O<B H(&EN="!N(#T ;6%X.R M+6X^,#L M92!L87)G97( >6]U<B!P<F]G<F%M(&ES+"!T:&4 ;6]R92!M86EN=&5N86YC M92!R97%U:7)E9"X 2722<R!B97-T('1O(')E=7-E(&-O9&4 87, ;75C:"!A M<R!P;W-S:6)L92!B96-A=7-E('1H:7, =VEL;"!R961U8V4 ;6%I;G1E;F%N M8V4O9&5B=6=G:6YG('1I;64N(%-O;65T:6UE<R!O<'1I;6ES871I;VYS(&UE M86X 8G)E86MI;F< =&AI<R!R=6QE+"!B=70 <F5M96UB97( =&AA="!O;FQY M('1H92!C<FET:6-A;"]T:6UE;'D <&%R=', ;V8 =&AE('!R;V=R86T ;F5E M"CQ(,3Y$(&%R<F%Y<R!C86X 8F4 <V]R=&5D/"](,3X-" T*"6EN=%M=($$[ M/$ Q/D0 87)R87ES(&-A;B!B92!R97-I>F5D(&]N('1H92!F;'D\+T Q/ T* M/3T 0BD +R]4:&5N(&)O=& 87)E(&5Q=6%L(&EN(&QE;F=T:"!A;F0 :71E M>6]U(&MN;W< =&AA="!T:&5R92!I<R!A($0 ;F5W<V=R;W5P(&]N(&YE=W,N M9&EG:71A;&UA<G,N8V]M('-E<G9E<C\ 2&5R92!Y;W4 8V%N(&%S:R]S=6=G M97-T(&%N>71H:6YG(&%B;W5T($0 86YD(&5V96X =&%L:R!T;R!T:&4 8W)E M(&5X=')A8W0 8V]D92!F<F]M(&AT;6P <&%G97, 86YD(&-O;7!I;&4 :70 M;&EK92!N;W)M86P 8V]D92X (%=H870 87)E('1H92!A9'9A;G1A9V5S(&]F M('1H:7,_($%P87)T(&9R;VT 8F5G:6YN:6YG(&%B;&4 =&\ :V5E<"!C;V1E M('=I=& 9&]C=6UE;G1A=&EO;B!F=71U<F4 1"!)1$62<R!M87D 8F4 86)L M92!T;R!U<V4 =&AI<R!F96%T=7)E(&9O<B!A=71O;6%T:6, <WEN=&%X(&AI M=F4 86YY(&YO=&5S('EO=2!W;W5L9"!L:6ME('1O('-H87)E+"!E;6%I;"!- M871H97< 5VEL<V]N(&1M9$!S>6YE<VES+F-O;2YA=2!O<B!*;V5L($%N9&5R M<V]N(&%N9&5R<V]N0&9I<F5S=&%R+F-O;2YA=2X 5&AE>2!M=7-T(&)E(&)E M='=E96X ;VYE+7-E;G1E;F-E(#T^('1W;RUM961I=6TM<&%R86=R87!H<R!A M;F0O;W( <VUA;&P <VYI<'!E=', ;V8 8V]D92X 3W1H97)W:7-E('1H97F2 M;&P 8F4 8V]N<VED97)E9"!F;W( =&AE(&AI;G1S(&%N9"!T:7!S('-E8W1I M:V5Y('1O(&=O;V0 <')O9W)A;6UI;F<[(&)U="!I9B!Y;W4 9&]NDG0 =&\ M<')O9W)A;2 H<VEC*2!T:&5N(&AO=R!C86X >6]U(&1E<VEG;C\-" T*3VX M82!M;W)E('-E<FEO=7, ;F]T92!534P :7, 82!G<F5A="!D97-I9VYI;F< M;65T:&]D;VQO9WD 9F]R(&]B:F5C="!O<FEE;G1A=&5D(&QA;F=U86=E<R!L M:6ME($0N($AE<F4 87)E('-O;64 ;&EN:W, =&\ 9V5T(&YE=V)I99)S('-T M=6UL+VEN9&5X+FIS<)0^4F%T:6]N86R2<R!534P 5V5B<&%G93PO03X-"CQ! M($A2148 /2"3:'1T<#HO+W=W=RYO;6<N;W)G+V=E='1I;F=S=&%R=&5D+W=H M871?:7-?=6UL+FAT;90^26YT<F]D=6-T:6]N('1O($]-1R=S(%5-3#PO03X- M"CQ!($A2148 /2"3:'1T<#HO+W=W=RYS<&%R>'-Y<W1E;7,N8V]M+F%U+U5- M<B!S=6=G97-T:6]N<RD-" T*5&AE(&%B;W9E(&%R92!P<F5T='D =&5C:&YI M8V%L(&%N9"!)DF0 <W5G9V5S="!A('-M86QL(&%M;W5N="!O9B!P<F]G<F%M M<VAO=6QD(&)E(&QO=VQY(&-O=7!L960 86YD(&AI9VAL>2!C;VAE<VEV92X M/ T*4')O9W)A;7, 87)E(&AI9VAL>2!C;W5P;&5D('=H96X =&AE>2!A<F4 M:&5A=FEL>2!R96QI86YT(&]N(&]N92!A;F]T:&5R+B!4:&ES(&ES(&-O;G-I M9&5R960 3D]4($$ 1T]/1"!42$E.1RX 1F]R(&5X86UP;&4 82!C87( =&AA M="!O;FQY('5S97, ;VYE('1Y<&4 ;V8 ='ER92!A;F0 =&AA="!T>7)E(&]N M;'D 8F5I;F< =7-E86)L92!O;B!T:&%T(&-A<BX 26X =&AI<R!C87-E('1H M92!T>7)E(&ES(&YO="!R975S86)L92X 66]U(&-A;I)T('9E<GD =V5L;"!T M86ME('1H92!T>7)E(&%N9"!U<V4 :70 ;VX 86YO=&AE<B!C87(N($AI9V M8V]U<&QI;F< ;6%K92!P<F]G<F%M<R!L97-S(')E=7-A8FQE+B -" T*/$ R M/D-O:&5S:6]N/"](,CX-"D-O:&5S:6]N(&ES('1H92!W87D =&AI;F=S('=O M<FL =&]G971H97(N(%1A:V4 =&AE(&-A<B!E>&%M<&QE(&%G86EN+B!3=7!P M;W-E('1H92!T>7)E('=A<R!S;R!G96YE<F%L:7-E9"!T:&%T(&ET(&5V96X M=V]R:W, ;VX >6]U<BUN97AT+61O;W(M;F5I9VAB;W5R<R!B:6QL>6-A<G0N M3&]W(&-O:&5S:6]N(&UA:V5S(&-O;7!O;F5N=', ;&5S<R!F;&5X:6)L92]E M(&=E="!T:&4 8F%L86YC92!J=7-T(')I9VAT(&)E='=E96X =&AE<V4 ='=O M(&-O;F-E<'1S(&)U="!J=7-T(&ET(&EN('1H92!B86-K(&]F('EO=7( ;6EN M9"!A;F0 >6]U<B!P<F]G<F%M<R!W:6QL(&)E(&%L;"!T:&4 8F5T=&5R+B!2 M96UE;6)E<BP :&EG:"!C;VAE<VEO;B!A;F0 ;&]W(&-O=7!L:6YG(#T 9V]O M9"!T:&EN9R!B=70 ;&]W(&-O:&5S:6]N(&%N9"!H:6=H(&-O=7!L:6YG(#T M:&5N('1O($]P=&EM:7-E/"](,3X-"E1H97)E(&%R92!T=V\ ;6%I;B!T>7!E M<R!O9B!O<'1I;6ES871I;VX <W!E960 86YD('-I>F4N($]P=&EM:7-A=&EO M;B!O;FQY(&YE961S('1O(&)E('5S960 =VAE;B!T:&EN9W, :&%V92!T;R!B M(&%N(&ET97)A=&EV92!P<F]C97-S+B!);B!T:&4 9&5S:6=N('-T86=E(&]P M=&EM:7-A=&EO;B!S:&]U;&0 8F4 ;VX 82!G;&]B86P <V-A;&4N("!!<R!T M:&4 <')O:F5C="!P<F]G<F5S<V5S(&9O8W5S('-H;W5L9"!N87)R;W<N( T* M,BX 1F]C=7, ;VX =&AE(&%R96%S(&EN('1H92!C;V1E('=H:6-H(&%R92!B M;W1T;&4 ;F5C:W, *&]P=&EM:7-A=&EO;B!P<F]B;&5M(&%R96%S*2X-"C,N M($%S('1H92!P<F]J96-T(&UO=F5S(&%L;VYG(&-O;G1I;G5A;&QY(&QO;VL M9F]R(&]P=&EM:7-A=&EO;B!O<'!O<G1U;FET:65S+B!!<VL >6]U<G-E;&8Z M=7(_( T*"0E)<R!I="!W;W)T:"!S<&5N9&EN9R!M>2!V86QU86)L92!T:6UE M92!O=F5R86QL(&1E<VEG;C\-" D)5VEL;"!T:&ES(&-H86YG92!M86ME('1H M07, =&AE('!R;VIE8W0 9&5V96QO<',L(&%T=&5M<'0 =&\ 9W)O=7 <VEM M=6QA<B!F=6YC=&EO;G,O=&%S:W, =&]G971H97(N(%1H:7, =VEL;"!M96%N M(&QE<W, ;W!T:6UI<V%T:6]N+"!B96-A=7-E(&-O9&4 :7, ;6]R92!C96YT M<F%L:7-E9"X-"C4N($1O;I)T(&]V97( ;W!T:6UI<V4N($EF('1H92!C;V1E M(&UE971S(&ET<R!O<'1I;6ES871I;VX ;F5E9', *&EN(&%L;"!C87-E<RDL M;F0 8V]M;65N=&EN9R!C;W5L9"!A8W1U86QL>2!S879E('EO=2!T:6UE(&EN M('1H92!L;VYG(')U;BX 3VX =&AE(&]T:&5R(&AA;F0L(&EF('EO=2!B<F5A M:R!T:&EN9W, 9&]W;B!O<B!C;VUM96YT('1O;R!M=6-H(&-O;7!L97AI='D M8F5G:6YS('1O(')E87( :71S('5G;'D :&5A9"!A9V%I;BX-" T*/$D^2F]E M<&EN9R!T:&EN9W, ;&]C86QI<V5D(&%R92!N;W0 86QW87ES(&]B=FEO=7, M=&\ 82!B96=I;FYE<BX 5VAA="!I<R!L;V-A;&ES871I;VX_($ET(&UE86YS M('1O(&ME97 =&AI;F=S('=I=&AI;B!T:&4 9FEE;&1S+V)L;V-K<R!I;B!W M:&EC:"!T:&5Y(&%R92!U<V5D+B!4:&ES(')U;&4 9&]E<R!N;W0 :G5S="!A M<'!L>2!T;R!P=6)L:6,O<')O=&5C=&5D+W!R:79A=&4 8G5T(&%L<V\ =&\ M=F%R:6%B;&5S('=I=& 8FQO8VMS+B!,;V-A;&ES871I;VX <F5D=6-E<R!C M;VUP;&5X:71Y(&)U="!I="!D;V5S(&AO=V5V97( ;65A;B!T:&%T(&UO<F4 M=&AI;F=S(&AA=F4 =&\ 8F4 <&%S<V5D(&)Y('!A<F%M971E<B]A<F=U;65N M="X-" T*22!H860 82!F<FEE;F0 =VAO(&=R97< <VEC:R!O9B!T>7!I;F< MDVEN=)0 979E<GD =&EM92!H92]S:&4 ;6%D92!A(&QO;W N(%-O(&AE+W-H M92!D96-I9&5D(&ET('=O=6QD(&)E(&$ 9V]O9"!I9&5A('1O(&1E8VQA<F4 MDVEN="!NE"!A<R!A(&=L;V)A;" H<V\ 979E<GD 9G5N8W1I;VX :&%S(&%C M8V5S<R!T;R!N*2X 54U-+BXN($AA<R!H:7,O:&5R('!R;V=R86T 9W)O=R!T M:&4 DV9O<B H;CTP.R!N/$UA>#L ;BLK*2![A7T[E"!S=&%T96UE;G0 8F5C M;VUE(&%U=&]M871I8RX 3&ET=&QE(&1I9"!T:&5Y(')E86QI<V4 =&AE(&)U M("AN/3 [(&X\36%X,3L ;BLK*0T*"7L-" D)A0T*"7T-"GT-" T*=F]I9"!& M8V]D92!A8F]V93\-" T*4V\ 9&]NDG0 ;6%K92!T:&4 <V%M92!M:7-T86ME M('1H97D 9&ED+"!K965P('1H:6YG<R!S:6UP;&4 8GD ;&]C86QI<VEN9R!E M1T]43R!I<R!%=FEL/"](,3X-"DEF('EO=2!M96YT:6]N($=/5$\ ;VX :G5S M="!A8F]U="!A;GD <')O9W)A;6UI;F< =V5B<VET92P >6]UDG)E(&QI:V5L M>2!T;R!G970 9FQA;65D+B!';W1ODG, 8G)E86MS('1H92!S=')U8W1U<F4O M9FQO=R!O9B!T:&4 <')O9W)A;2!A;F0 8V]M<&QI97)S(&9I;F0 :70 ;6]R M92!D:69F:6-U;'0 =&\ ;W!T:6UI<V4 9V]T;R!S=&%T96UE;G1S+B -" T* M5&AE<F4 :7, :G5S="!A8F]U="!A;'=A>7, 82!B971T97( =V%Y('1O('=R M:71E('-O;65T:&EN9R!W:71H;W5T('5S:6YG('1H92!D<F5A9&5D($=/5$\ M<W1A=&5M96YT+B 36%N>2!M;V1E<FX ;&%N9W5A9V5S(&1O;I)T(&5V96X M:&%V92!G;W1O+B!!;'1H;W5G:"!A<R!786QT97( *)-0<F]G<F%M;6EN9R!I M960 =VET:"!T:&4 1"!F96%T=7)E(&]F(&QA8F5L;&5D(&)R96%K(&%N9"!C M;VYT:6YU92!S=&%T96UE;G1S+B!"=70 1"!I<R!A('!R86-T:6-A;"!L86YG M=6%G92!F;W( <')A8W1I8V%L('!R;V=R86UM97)S('=H;R!K;F]W('=H96X M=&AE(')U;&5S(&YE960 =&\ 8F4 8G)O:V5N+B!3;R!O9B!C;W5R<V4 1"!S ` end
Jun 14 2002
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'll have a look. Note I didn't make it for a website, I just did that to keep things in = order. I though this was going to be phased by some CGI script or = somthing, but a localised part should be ok as well. I found the = previous bugs (not using H1) before your post, but wasn't going to send = until I had a bit more. If you want html l'll put in in html (or xtml) . = =20 I'll look though those notes, thanks. "Matthew Wilson" <dmd synesis.com.au> wrote in message = news:aeclsn$2o24$1 digitaldaemon.com... OK, I've fixed the bugs up (included) My thoughts (editor hat comically hanging off the left brow, so I can = watch the South Korea - Portugal game with the right :): 1. Walking backwards in arrays - ok, useful for programming neophytes. Could do with explanation of which is preferred and why 2. Filler - not sure these = are terribly useful, unless each is contextualised. The optimisation one = is worth saying, however 3. D arrays can be sorted - need to comment on the sort = order 4. D arrays can be resized - perfect note 5. Comparing arrays - perfect note 6. D newsgroup - good note (although = links will be on the site) 7. HTML embedded code - good note 8. Notes - not necessary. = There'll be full info on how to write for us on the magazine site, but good to mention in this file for the moment 9. Which comes first - think this is way too = complex a topic to be summed up in a note. What about an article? 10. Cohesion / Coupling - reasonable 11. When to Optimise - should be a Tip. Could be = useful as such. You'd need to provide citations for your quotes/statements 12. KISS / KINAS - Again, statements without rationale. Need to back up these philosophical points 13. Localisation - [localisation is often = used as an interchangeable term with internationalisation]. What you are = talking about is locality-of-reference. Again would be better as a Tip = including references 14. goto - Needs some concrete = dangers of goto, and also at least one situation where they are = useful/necessary Keep em coming. We've got at least 7 out of that lot. In publishing = 50% is pretty good, let me tell you (as a battle-scarred weary word-warrior). :) "anderson" <anderson firestar.com.au> wrote in message news:aeckfv$2mms$1 digitaldaemon.com... > Any suggestions? > > >
Jun 14 2002
boundary="----=_NextPart_001_0070_01C213EB.823F1610" ------=_NextPart_001_0070_01C213EB.823F1610 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Ok, I've made a few changes. Perhaps some of the things I added should = be tips. It's in html now, but I've discovered that my html editors = have stopped working (xp -upgrade), so I simply used word (yuk). It = shouldn't be a problem to convert it to standard html/xhtml later = though. I don't mind the constructive criterions. I fact I'm suprised any of = them got though at all (note to self - better double check that dogy = code and gramma). I didn't spend to much time writing them. I hoped it = would just spark others off.=20 On another note, parhaps someone should start a hints and tips (or tips = and tricks) list. Just to get a big collection of them which you (or = someelse) can sort though for the first issue. Over PS I was just reading though this neat webpage - interesting about = programming personality, some of it is opinion based, but it's still = good. http://homepage.mac.com/kevinmarks/personality.html ------=_NextPart_001_0070_01C213EB.823F1610 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META http-equiv=3DContent-Type content=3D"text/html; = charset=3Diso-8859-1"> <META content=3D"MSHTML 6.00.2716.2200" name=3DGENERATOR> <STYLE></STYLE> </HEAD> <BODY bgColor=3D#ffffff> <DIV><FONT face=3DArial size=3D2>Ok, I've made a few changes. = Perhaps some of=20 the things I added should be tips. It's in html now, but I've = discovered=20 that my html editors have stopped working (xp -upgrade), so I simply = used word=20 (yuk). It shouldn't be a problem to convert it to standard = html/xhtml=20 later though.</FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>I don't mind the constructive = criterions. I fact=20 I'm suprised any of them got though at all (note to self - better double = check=20 that dogy code and gramma). I didn't spend to much time writing = them. I=20 hoped it would just spark others off. </FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>On another note, parhaps someone should = start a=20 hints and tips (or tips and tricks) list. Just to get a big collection = of them=20 which you (or someelse) can sort though for the first=20 issue.</FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Over</FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>PS</FONT></DIV> <DIV><FONT face=3DArial size=3D2>I was just reading though this neat = webpage -=20 interesting about programming personality, some of it is opinion = based,=20 but it's still good.</FONT></DIV> <DIV><FONT face=3DArial size=3D2><A=20 href=3D"http://homepage.mac.com/kevinmarks/personality.html">http://homep= age.mac.com/kevinmarks/personality.html</A></FONT></DIV></BODY></HTML> ------=_NextPart_001_0070_01C213EB.823F1610--
Jun 14 2002
It's an old story... you can only apply operator = to array.length. For example, all these lines are _invalid_: array.length++; array.length--; array.length += 123; array.length -= 321; The valid form is: array.length = array.length + 1; array.length = array.length - 1; Etc. Just don't ask me why - I didn't really understand Walter's arguments the last time we discussed it. =) By the way, one thing that might be classified as a tip is that D array can be used to easily construct a stack: int[] stack; ... stack ~= 666; // push a value; ... a = stack[stack.length-1]; // get last element ... stack.length = stack.length - 1; // pop last element
Jun 14 2002
"Pavel Minayev" <evilone omen.ru> wrote in message news:aedefn$gt7$1 digitaldaemon.com...It's an old story... you can only apply operator = to array.length. For example, all these lines are _invalid_: array.length++; array.length--; array.length += 123; array.length -= 321; The valid form is: array.length = array.length + 1; array.length = array.length - 1;Thanks, I said there are probably code errors ( I haven't had time to test any of it).Etc. Just don't ask me why - I didn't really understand Walter's arguments the last time we discussed it. =) By the way, one thing that might be classified as a tip is that D arraycanbe used to easily construct a stack: int[] stack; ... stack ~= 666; // push a value; ... a = stack[stack.length-1]; // get last element ... stack.length = stack.length - 1; // pop last elementPerfect, I've added it as a NOTE. Just a point to everyone, next time could you please put it in this form <Title> Description Code (if needed) More Description (if needed) <Author> That way I don't need to modify the authors orignal message. Thanks begin 666 D Notes.htm M/&AT;6P >&UL;G,Z;STB=7)N.G-C:&5M87,M;6EC<F]S;V9T+6-O;3IO9F9I M8V4Z;V9F:6-E( T*>&UL;G,Z=STB=7)N.G-C:&5M87,M;6EC<F]S;V9T+6-O M;3IO9F9I8V4Z=V]R9"(-"GAM;&YS/2)H='1P.B\O=W=W+G<S+F]R9R]44B]2 M;G0M5'EP92!C;VYT96YT/2)T97AT+VAT;6P[(&-H87)S970]=VEN9&]W<RTQ M,C4R(CX-"CQM971A(&YA;64]4')O9TED(&-O;G1E;G0]5V]R9"Y$;V-U;65N M=#X-"CQM971A(&YA;64]1V5N97)A=&]R(&-O;G1E;G0](DUI8W)O<V]F="!7 M,C!.;W1E<U]F:6QE<R]F:6QE;&ES="YX;6PB/ T*/'1I=&QE/DYO=&5S/"]T M:71L93X-"CPA+2U;:68 9W1E(&US;R Y73X\>&UL/ T*(#QO.D1O8W5M96YT M93X-"B /&\Z0W)E871E9#XR M=&5D/ T*(" \;SI,87-T4V%V960^,C P,BTP-BTQ-50P,CHQ-SHP,%H\+V\Z M3&%S=%-A=F5D/ T*(" \;SI086=E<SXQ/"]O.E!A9V5S/ T*(" \;SI7;W)D M;SI,:6YE<SXS,CPO;SI,:6YE<SX-"B /&\Z4&%R86=R87!H<SXY/"]O.E!A M;SI697)S:6]N/ T*(#PO M(5ME;F1I9ETM+3X\(2TM6VEF(&=T92!M<V\ .5T^/'AM;#X-"B \=SI7;W)D M;F=3=&%T93X-"B /'<Z1W)A;6UA<E-T871E/D-L96%N/"]W.D=R86UM87)3 M=&%T93X-"B /'<Z0G)O=W-E<DQE=F5L/DUI8W)O<V]F=$EN=&5R;F5T17AP M;&]R97(T/"]W.D)R;W=S97),979E;#X-"B \+W<Z5V]R9$1O8W5M96YT/ T* M1&5F:6YI=&EO;G, *B\-"B!P+DUS;TYO<FUA;"P ;&DN37-O3F]R;6%L+"!D M;VXZ=VED;W<M;W)P:&%N.PT*"6US;RUL87EO=70M9W)I9"UA;&EG;CIN;VYE M" EF;VYT+69A;6EL>3I!<FEA;#L-" EM<V\M9F%R96%S="UF;VYT+69A;6EL M>3HB5&EM97, 3F5W(%)O;6%N(CL-" EM<V\M8FED:2UF;VYT+69A;6EL>3HB M;7-O+7!A9VEN871I;VXZ=VED;W<M;W)P:&%N.PT*"6US;RUO=71L:6YE+6QE M=71O<W!A8V4Z;F]N93L-" EF;VYT+7-I>F4Z,3(N,'!T.PT*"69O;G0M9F%M M:6QY.D%R:6%L.PT*"6US;RUB:61I+69O;G0M9F%M:6QY.B)4:6UE<R!.97< M4F]M86XB.PT*"6US;RUF;VYT+6ME<FYI;F<Z,'!T.PT*"69O;G0M=V5I9VAT M.FYO<FUA;#M M;F]N93L-" EF;VYT+7-I>F4Z,3(N,'!T.PT*"69O;G0M9F%M:6QY.D%R:6%L M.PT*"6US;RUB:61I+69O;G0M9F%M:6QY.B)4:6UE<R!.97< 4F]M86XB.PT* M"69O;G0M=V5I9VAT.FYO<FUA;#M M;&4M;F%M93HB(CL-" EM<V\M<W!L+64Z>65S.WT-"G-P86XN1W)A;44-" E[ M;CL-" EM<V\M9F]O=&5R+6UA<F=I;CHN-6EN.PT*"6US;RUP87!E<BUS;W5R M8V4Z,#M M92UR;W=B86YD+7-I>F4Z,#L-" EM<V\M='-T>6QE+6-O;&)A;F0M<VEZ93HP M.PT*"6US;RUS='EL92UN;W-H;W<Z>65S.PT*"6US;RUS='EL92UP87)E;G0Z M;7-O+7!A<F$M;6%R9VEN.C!I;CL-" EM<V\M<&%R82UM87)G:6XM8F]T=&]M M,BXP<'0[;6%R9VEN+7)I9VAT.C!I;CMM87)G:6XM8F]T=&]M.C,N,'!T.VUA M<F=I;BUL969T. T*,&EN.W!A9V4M8G)E86LM869T97(Z879O:60G/CQB/CQS M<&%N('-T>6QE/2=F;VYT+7-I>F4Z,38N,'!T.VUS;RUB:61I+69O;G0M9F%M M:6QY. T*07)I86P[;7-O+69O;G0M:V5R;FEN9SHQ-BXP<'0G/DYO=&5S/&\Z M<#X\+V\Z<#X M+71O<#HQ,BXP<'0[;6%R9VEN+7)I9VAT.C!I;CMM87)G:6XM8F]T=&]M.C,N M,'!T.VUA<F=I;BUL969T. T*,&EN.W!A9V4M8G)E86LM869T97(Z879O:60G M/CQB/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;G0M9F%M:6QY. T*07)I86P[;7-O+69O;G0M:V5R;FEN9SHQ-BXP<'0G/CQO M)VUA<F=I;BUT;W Z,3(N,'!T.VUA<F=I;BUR:6=H=#HP:6X[;6%R9VEN+6)O M='1O;3HS+C!P=#MM87)G:6XM;&5F=#H-"C!I;CMP86=E+6)R96%K+6%F=&5R M.F%V;VED)SX\8CX\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3H-"D%R:6%L.VUS;RUF;VYT+6ME<FYI;F<Z,38N M,'!T)SY786QK:6YG(&)A8VMW87)D<R!I;B!!<G)A>7,\;SIP/CPO;SIP/CPO M<W!A;CX\+V(^/"]H,3X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R M/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^5V%L:VEN9PT*87)R87ES(&)A8VMW M87)D<R!A<F4 =7-E9G5L(&9O<B!A;&PM<V]R=', ;V8 =&AI;F=S('-U8V M87, <F5M;W9I;F< 86X :71E;0T*9G)O;2!A;B!A<G)A>2X /&\Z<#X\+V\Z M<#X M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,] M37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB M:61I+69O;G0M9F%M:6QY.D%R:6%L)SY4:')E90T*;6%I;B!W87ES('1O(&1O M('1H:7,L('1A:V4 >6]U<B!P:6-K+CQO.G ^/"]O.G ^/"]S<&%N/CPO<#X- M" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z M,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P M;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL M/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B M+6-O=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A;B!C;&%S<SU'<F%M M13YF;W(\+W-P86X^(" :6YT(&X-"CT ;6%X.R!N)F=T.S [("D /&\Z<#X\ M+V\Z<#X M<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ MH*" H*" H*" H*" H*" H" \+W-P86X^/'-P86X 8VQA<W,]1W)A;44^05L\ M/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\+W-P M;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/C(N M/&\Z<#X\+V\Z<#X M/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF MH*" H*" H*" H" \+W-P86X^/'-P86X 8VQA<W,]1W)A;44^9F]R/"]S<&%N M93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA M;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B+6-O=6YT.C(G/J" H*" H*" H*" MH*" H*" H*" H*" (#PO<W!A;CY!6VY=.SQO.G ^/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N M<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M M=&%B+6-O=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A;B!C;&%S<SU' M<F%M13YF;W(\+W-P86X^(" :6YT(&X-"CT ;6%X.R M+6XF9W0[,#L *2 \ M<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A M;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B+6-O=6YT.C(G/J" MH*" H*" H*" H*" H*" H*" H*" (#PO<W!A;CY!6VY=.SQO.G ^/"]O.G ^ M/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE M/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED M:2UF;VYT+69A;6EL>3I!<FEA;"<^5VAI8V -"FES('!R969E<F%B;&4_(%=E M;&P =&AA=))S(')E86QL>2!U<"!T;R!Y;W5R('-T>6QE(&]F(&-O9&EN9R!A M93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB M<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS M<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M M(&%D9"!B<F%C:V5T<R!Y;W4 8V%N('=R:71E(&-O9&4 8F5F;W)E(&%N9 T* M/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B M+6-O=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A;B!C;&%S<SU'<F%M M13YF;W(\+W-P86X^(" :6YT(&X-"CT ;6%X.R!N)F=T.S [("D /&\Z<#X\ M+V\Z<#X M<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ MH*" H" \+W-P86X^>SQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA M<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS M;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\<W!A; T*<W1Y;&4])VUS;RUT M86(M8V]U;G0Z,B<^H*" H*" H*" H*" H*" H*" H*" H* /"]S<&%N/B\O M0V]D92!B969O<F4 ;BTQ/&\Z<#X\+V\Z<#X M;&%S<SU-<V].;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[ M+71A8BUC;W5N=#HR)SZ H*" H*" H*" H*" H*" H*" H*" H" \+W-P86X^ M/'-P86X 8VQA<W,]1W)A;44^05L\+W-P86X^+2UN73L\;SIP/CPO;SIP/CPO M9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^ M/'-P86X-"G-T>6QE/2=M<V\M=&%B+6-O=6YT.C(G/J" H*" H*" H*" H*" MH*" H*" H*" (#PO<W!A;CXO+T-O9&4 869T97( ;BTQ/&\Z<#X\+V\Z<#X\ M)V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG M+W-P86X^?3QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I M+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP/CPO<W!A;CX\ M:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^268-"GEO M=9)R92!A(&-L87-S:6, <W1I8VLM=&\M=&AE+69O<FUA="!T>7!E(&]F('!E M:V5E<', =&AE(&QO;W :6X :71S(&=E;F5R86P 9F]R;6%T(&%N9"!T:&5R M;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO M.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R M;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;G0M9F%M:6QY.D%R:6%L)SY)9 T*>6]UDG)E(&$ :V5Y8F]A<F0M<W!E960M M9G)E86L =&AE;B S(&ES('!R;V)A8FQY('EO=7( ;6]T;W( 8V%R+B!)="!H M87,-"G-L:6=H=&QY(&QE<W, 8V]D92!T:&5N('1H92!O=&AE<B!T=V\N/&\Z M<#X\+V\Z<#X M86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI M;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' M8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP M='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I! M<FEA;"<^2F]E; T*06YD97)S;VX\;SIP/CPO;SIP/CPO<W!A;CX\+VD^/"]P M93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB M<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/& Q('-T>6QE/2=M87)G:6XM=&]P M.C$R+C!P=#MM87)G:6XM<FEG:'0Z,&EN.VUA<F=I;BUB;W1T;VTZ,RXP<'0[ M/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF M>7, 8V%N(&)E('-O<G1E9#QO.G ^/"]O.G ^/"]S<&%N/CPO8CX\+V Q/ T* M,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [ M/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N M('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY M.D%R:6%L)SY&;W)G970-"FQO;W!S+"!$(&AA<R!S;W)T:6YG(&%S(&]N92!O M9B!A;B!A<G)A>9)S(&%T=')I8G5T97,N(#QS<&%N('-T>6QE/2=M<V\M=&%B M+6-O=6YT. T*,2<^H*" H*" H*" H" \+W-P86X^/&\Z<#X\+V\Z<#X\+W-P M;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO M.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R M;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M<&%N(&-L87-S/4=R86U%/D$\+W-P86X^(&EN+7!L86-E+CQO.G ^/"]O.G ^ M/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE M/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED M:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B+6-O M=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A;B!C;&%S<SU'<F%M13YI M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE/2=M<V\M M=&%B+6-O=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CXN+BX\;SIP/CPO;SIP M93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA M;"<^/'-P86X-"G-T>6QE/2=M<V\M=&%B+6-O=6YT.C$G/J" H*" H*" H*" M(#PO<W!A;CX\<W!A;B!C;&%S<SU3<&5L;$4^02YS;W)T/"]S<&%N/CL\;SIP M;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL M>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X M;&%S<SU-<V].;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[ M;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^ M/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQI/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R M.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T M>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ /"]S<&%N/CQO.G ^/"]O.G ^/"]S M<&%N/CPO<#X-" T*/& Q('-T>6QE/2=M87)G:6XM=&]P.C$R+C!P=#MM87)G M:6XM<FEG:'0Z,&EN.VUA<F=I;BUB;W1T;VTZ,RXP<'0[;6%R9VEN+6QE9G0Z M;#MM<V\M9F]N="UK97)N:6YG.C$V+C!P="<^1"!A<G)A>7, 8V%N(&)E(')E M<VEZ960 ;VX =&AE(&9L>3QO.G ^/"]O.G ^/"]S<&%N/CPO8CX\+V Q/ T* M,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [ M/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N M('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY M.D%R:6%L)SY&;W)G970-"CQS<&%N(&-L87-S/5-P96QL13YR96%L;&]C/"]S M<&%N/BP 1"!C86X <F5S:7IE(#QS<&%N(&-L87-S/4=R86U%/F%R<F%YDG,\ M"CQP(&-L87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P M+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\ M+V\Z<#X M<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ M07)I86PG/E1H:7,-"G=I;&P <F5S:7IE('1H92!A<G)A>2!!(&)Y(&]N92X\ M<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A M;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X M<"!C;&%S<SU-<V].;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP M;7-O+71A8BUC;W5N=#HQ)SZ H*" H*" H*" H" \+W-P86X^/'-P86X 8VQA M<W,]1W)A;44^:6YT6SPO<W!A;CY=($$[/&\Z<#X\+V\Z<#X\+W-P86X^/"]P M='EL93TG;7-O+71A8BUC;W5N=#HQ)SZ H*" H*" H*" H" \+W-P86X^+BXN M/&\Z<#X\+V\Z<#X M/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF MH*" H*" (#PO<W!A;CX\<W!A;B!C;&%S<SU3<&5L;$4^02YL96YG=& \+W-P M86X^*RL[/&\Z<#X\+V\Z<#X M;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQI/CQS<&%N('-T>6QE/2=F;VYT M+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY*;V5L M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\ M<F=I;BUR:6=H=#HP:6X[;6%R9VEN+6)O='1O;3HS+C!P=#MM87)G:6XM;&5F M=#H-"C!I;CMP86=E+6)R96%K+6%F=&5R.F%V;VED)SX\8CX\<W!A;B!S='EL M93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3H-"D%R M/&\Z<#X\+V\Z<#X M<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF M;VYT+69A;6EL>3I!<FEA;"<^1"!A;&QO=W,-"GEO=2!T;R!Q=6EC:VQY(&-O M;7!A<F4 87)R87ES('=I=& DST]E"X\;SIP/CPO;SIP/CPO<W!A;CX\+W ^ M.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S M<#L\+V\Z<#X M86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI MH*" H*" H" \+W-P86X^/'-P86X 8VQA<W,]1W)A;44^:6YT6SPO<W!A;CY= M($$[/&\Z<#X\+V\Z<#X M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N M)SZ H*" H*" H*" H" \+W-P86X^/'-P86X 8VQA<W,]1W)A;44^:6YT6SPO M<W!A;CY=($([/&\Z<#X\+V\Z<#X M<V].;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I M;W5N=#HQ)SZ H*" H*" H*" H" \+W-P86X^+BXN/&\Z<#X\+V\Z<#X\+W-P M;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQS M86X^/'-P86X 8VQA<W,]1W)A;44^:68\+W-P86X^("A!(#T M96X 8F]T:"!A<F4 97%U86P :6X ;&5N9W1H(&%N9"!I=&5M<RX\;SIP/CPO M='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I! M<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X M<SU-<V].;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O M+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/D)U= T*9&]NDG0 =V]R<GD <F5F M97)E;G1I86P =&5S=&EN9R!I<R!S=&EL;"!S=7!P;W)T960 =VET:""3/3T] ME#QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L M/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M M"CQP(&-L87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P M+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P86X-"G-T>6QE M/2=M<V\M=&%B+6-O=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A;B!C M"CQP(&-L87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P M+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\ M+V\Z<#X M86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI M;'DZ07)I86PG/DIO96P-"D%N9&5R<V]N/&\Z<#X\+V\Z<#X\+W-P86X^/"]I M/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT M+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP M;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT M+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\+W-P86X^/"]P/ T* M:6X[;6%R9VEN+6)O='1O;3HS+C!P=#MM87)G:6XM;&5F=#H-"C!I;CMP86=E M+6)R96%K+6%F=&5R.F%V;VED)SX\8CX\<W!A;B!S='EL93TG9F]N="US:7IE M.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3H-"D%R:6%L.VUS;RUF;VYT M+6ME<FYI;F<Z,38N,'!T)SY(5$U,($EM8F5D9&5D(&-O9&4\;SIP/CPO;SIP M/CPO<W!A;CX\+V(^/"]H,3X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N M('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY M+CQS<&%N('-T>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ (#PO<W!A;CY7:&%T M(&%R92!T:&4 861V86YT86=E<R!O9B!T:&ES/PT*07!A<G0 9G)O;2!B96=I M;FYI;F< 86)L92!T;R!K965P(&-O9&4 =VET:"!D;V-U;65N=&%T:6]N(&9U M='5R92!$($E$19)S(&UA>2!B90T*86)L92!T;R!U<V4 =&AI<R!F96%T=7)E M(&9O<B!A=71O;6%T:6, <WEN=&%X(&AI9VAL:6=H=&EN9R!A;F0 ;V)J96-T M(&-L87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P M=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z M<#X M<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ M07)I86PG/DIO96P-"D%N9&5R<V]N/&\Z<#X\+V\Z<#X\+W-P86X^/"]I/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N M<#HQ,BXP<'0[;6%R9VEN+7)I9VAT.C!I;CMM87)G:6XM8F]T=&]M.C,N,'!T M.VUA<F=I;BUL969T. T*,&EN.W!A9V4M8G)E86LM869T97(Z879O:60G/CQB M/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M M9F%M:6QY. T*07)I86P[;7-O+69O;G0M:V5R;FEN9SHQ-BXP<'0G/DYO=&5S M/&\Z<#X\+V\Z<#X M<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF M;VYT+69A;6EL>3I!<FEA;"<^268-"GEO=2!H879E(&%N>2!N;W1E<R!Y;W4 M=V]U;&0 ;&EK92!T;R!S:&%R92P 96UA:6P 36%T:&5W(%=I;'-O;B \<W!A M; T*8VQA<W,]4W!E;&Q%/F1M9$!S>6YE<VES+F-O;2YA=3PO<W!A;CX ;W( M2F]E;"!!;F1E<G-O;B \<W!A;B!C;&%S<SU3<&5L;$4^86YD97)S;VY 9FER M97-T87(N8V]M+F%U/"]S<&%N/BX-"E1H97D ;75S="!B92!B971W965N(&]N M92US96YT96YC92 ])F=T.R!T=V\M;65D:75M+7!A<F%G<F%P:', 86YD+V]R M92!C;VYS:61E<F5D(&9O<B!T:&4 :&EN=', 86YD('1I<',-"G-E8W1I;VX M9F]R('1H92!*;W5R;F%L+CQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' M8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP M='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I! M<FEA;"<^2F]E; T*06YD97)S;VX\;SIP/CPO;SIP/CPO<W!A;CX\+VD^/"]P M93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB M<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/& Q('-T>6QE/2=M87)G:6XM=&]P M.C$R+C!P=#MM87)G:6XM<FEG:'0Z,&EN.VUA<F=I;BUB;W1T;VTZ,RXP<'0[ M/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF M;VAE<VEO;B!A;F0 3&]W($-O=7!L:6YG/&\Z<#X\+V\Z<#X\+W-P86X^/"]B M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z M<#XF;F)S<#L\+V\Z<#X M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N M<&QE9"!A;F0 :&EG:&QY(&-O:&5S:79E+B!7:'D_(%=H870 9&]E<R!T:&ES M(&UE86X_/&\Z<#X\+V\Z<#X M;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO M<#X-" T*/& R('-T>6QE/2=M87)G:6XM=&]P.C$R+C!P=#MM87)G:6XM<FEG M<&%G92UB<F5A:RUA9G1E<CIA=F]I9"<^/&(^/&D^/'-P86X <W1Y;&4])V9O M(&-L87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P M=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^4')O9W)A;7,-"F%R92!H M:6=H;'D 8V]U<&QE9"!W:&5N('1H97D 87)E(&AE879I;'D <F5L:6%N="!O M;B!O;F4 86YO=&AE<BX 5&AI<R!I<PT*8V]N<VED97)E9"!.3U0 02!'3T]$ M(%1(24Y'+B!&;W( 97AA;7!L92!A(&-A<B!T:&%T(&]N;'D =7-E<R!O;F4 M92!O;B!T:&%T(&-A<BX 26X =&AI<R!C87-E('1H92!T>7)E(&ES(&YO= T* M<F5U<V%B;&4N(%EO=2!C86Z2="!V97)Y('=E;&P =&%K92!T:&4 ='ER92!A M('!R;V=R86US(&QE<W, <F5U<V%B;&4N(#QO.G ^/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N M<#HQ,BXP<'0[;6%R9VEN+7)I9VAT.C!I;CMM87)G:6XM8F]T=&]M.C,N,'!T M.VUA<F=I;BUL969T. T*,&EN.W!A9V4M8G)E86LM869T97(Z879O:60G/CQB M/CQI/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;G0M9F%M:6QY. T*07)I86PG/D-O:&5S:6]N/&\Z<#X\+V\Z<#X\+W-P86X^ M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M+B!486ME('1H92!C87( 97AA;7!L92!A9V%I;BX 4W5P<&]S92!T:&4 ='ER M90T*=V%S('-O(&=E;F5R86QI<V5D('1H870 :70 979E;B!W;W)K<R!O;B!Y M;W5R+6YE>'0M9&]O<BUN96EG:&)O=7)S(&)I;&QY8V%R="X-"E1H92!C87( M:6]N(&UA:V5S(&-O;7!O;F5N=', ;&5S<PT*9FQE>&EB;&4O969F:6-I96YT M('1O9V5T:&5R+CQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,] M37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB M:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP/CPO<W!A M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^2722 M<PT*;V9T96X 9&EF9FEC=6QT('1O(&=E="!T:&4 8F%L86YC92!J=7-T(')I M9VAT(&)E='=E96X =&AE<V4 ='=O(&-O;F-E<'1S(&)U= T*:G5S="!I="!I M;B!T:&4 8F%C:R!O9B!Y;W5R(&UI;F0 86YD('EO=7( <')O9W)A;7, =VEL M;"!B92!A;&P =&AE(&)E='1E<BX-"E)E;65M8F5R+"!H:6=H(&-O:&5S:6]N M(&%N9"!L;W< 8V]U<&QI;F< /2!G;V]D('1H:6YG(&)U="!L;W< 8V]H97-I M;VX 86YD(&AI9V -"F-O=7!L:6YG(#T 8F%D('1H:6YG+CQO.G ^/"]O.G ^ M/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE M/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M;TYO<FUA;#X\:3X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^2F]E; T*06YD97)S;VX\;SIP/CPO M86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI M;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' M8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP M;6%R9VEN+7)I9VAT.C!I;CMM87)G:6XM8F]T=&]M.C,N,'!T.VUA<F=I;BUL M969T. T*,&EN.W!A9V4M8G)E86LM869T97(Z879O:60G/CQB/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY. T* M07)I86P[;7-O+69O;G0M:V5R;FEN9SHQ-BXP<'0G/E-P965D($]P=&EM:7-A M=&EO;B!W:71H($9O<B!,;V]P<SQO.G ^/"]O.G ^/"]S<&%N/CPO8CX\+V Q M93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB M<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS M<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M M(&9O<B!T:&%T(&UA='1E<BD ;6%K92!S=7)E('1H870 >6]UDG)E(&YO="!R M96QO861I;F<-"G1H92!S86UE('9A;'5E(&5V97)Y('1I;64 87)O=6YD('1H M92!L;V]P+CQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I M+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP/CPO<W!A;CX\ M:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^1&]NDG0\ M<W!A;B!C;&%S<SU'<F%M13X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P M=#MM<V\M8FED:2UF;VYT+69A;6EL>3H-"D%R:6%L)SYF;W(\+W-P86X^/"]S M<&%N/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;G0M9F%M:6QY. T*07)I86PG/B H:6YT(&X],#L ;B F;'0[(#QS<&%N(&-L M87-S/5-P96QL13YG9713:7IE;V8\+W-P86X^*% I.R!N*RLI/&\Z<#X\+V\Z M<#X M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF M;VYT+69A;6EL>3I!<FEA;"<^A3QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T* M/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N M,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY]/&\Z<#X\+V\Z<#X\ M)V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG M/B\O5VAE<F4-"CQS<&%N(&-L87-S/5-P96QL13YG9713:7IE;V8\+W-P86X^ M(')E='5R;G, 82!C;VYS=&%N="!V86QU93QO.G ^/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N M<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A M"CQP(&-L87-S/4US;TYO<FUA;#X\<W!A;B!C;&%S<SU'<F%M13X\<W!A;B!S M='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3H- M"D%R:6%L)SYI;G0\+W-P86X^/"]S<&%N/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY. T*07)I86PG/B!3:7IE M(#T /'-P86X 8VQA<W,]4W!E;&Q%/F=E=%-I>F5O9CPO<W!A;CXH6"D[/&\Z M<#X\+V\Z<#X M86X 8VQA<W,]1W)A;44^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[ M;CX\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT M+69A;6EL>3H-"D%R:6%L)SX *&EN="!N/3 [(&X )FQT.R!3:7IE.R!N*RLI M/&\Z<#X\+V\Z<#X M/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^A3QO.G ^/"]O.G ^/"]S<&%N M/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT M+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY]/&\Z M<#X\+V\Z<#X M86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI M;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' M8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M;W0 8V%L;&EN9R!T:&4 /'-P86X 8VQA<W,]4W!E;&Q%/F9U8VYT:6]N/"]S M<&%N/B \<W!A;B!C;&%S<SU3<&5L;$4^/'-P86X-"F-L87-S/4=R86U%/F=E M=%-I>F5O9CPO<W!A;CX\+W-P86X^/'-P86X 8VQA<W,]1W)A;44^*#PO<W!A M;CXI+" \<W!A; T*8VQA<W,]4W!E;&Q%/F=E=%-I>F5O9CPO<W!A;CXH6"D M=&EM97,N/&\Z<#X\+V\Z<#X M;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQI/CQS<&%N('-T>6QE/2=F;VYT M+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY*;V5L M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\ M<F=I;BUR:6=H=#HP:6X[;6%R9VEN+6)O='1O;3HS+C!P=#MM87)G:6XM;&5F M=#H-"C!I;CMP86=E+6)R96%K+6%F=&5R.F%V;VED)SX\8CX\<W!A;B!S='EL M93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3H-"D%R M:6%L.VUS;RUF;VYT+6ME<FYI;F<Z,38N,'!T)SY3<&5E9"!/<'1I;6ES871I M;VX 9F]R(&QI;F5A<B!S96%R8VAE<SQO.G ^/"]O.G ^/"]S<&%N/CPO8CX\ M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^ M)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L M/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M M9F%M:6QY.D%R:6%L)SY4:&4-"F)A<VEC('-E87)C:"!L;V]K<R!L:6ME+CQO M.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS M<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M M(&-L87-S/4US;TYO<FUA;"!S='EL93TG;6%R9VEN+6QE9G0Z+C5I;B<^/'-P M86X 8VQA<W,]1W)A;44^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SYI;G0\+W-P86X^/"]S<&%N M+69A;6EL>3I!<FEA;"<^(&X],#L M"CQP(&-L87-S/4US;TYO<FUA;"!S='EL93TG;6%R9VEN+6QE9G0Z+C5I;B<^ M/'-P86X 8VQA<W,]1W)A;44^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z,3 N M,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SYW:&EL93PO<W!A;CX\ M+W-P86X^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I M+69O;G0M9F%M:6QY.D%R:6%L)SX *&XF;'0[36%X*3QO.G ^/"]O.G ^/"]S M<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L('-T>6QE/2=M87)G:6XM M;&5F=#HN-6EN)SX\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#L-"FUS M;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY[/&\Z<#X\+V\Z<#X\+W-P86X^ M.BXU:6XG/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.PT*;7-O+6)I M9&DM9F]N="UF86UI;'DZ07)I86PG/CQS<&%N('-T>6QE/2=M<V\M=&%B+6-O M=6YT.C$G/J" H*" H*" H*" (#PO<W!A;CX\<W!A; T*8VQA<W,]1W)A;44^ M:68\+W-P86X^("A!6VY=/3U396%R8V I/&\Z<#X\+V\Z<#X\+W-P86X^/"]P M:6XG/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.PT*;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQS<&%N('-T>6QE/2=M<V\M=&%B+6-O=6YT M.C$G/J" H*" H*" H*" (#PO<W!A;CY[/&\Z<#X\+V\Z<#X\+W-P86X^/"]P M:6XG/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.PT*;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQS<&%N('-T>6QE/2=M<V\M=&%B+6-O=6YT M.C(G/J" H*" H*" H*" H*" H*" H*" H*" (#PO M;W5N9"!A="!N/&\Z<#X\+V\Z<#X M<V].;W)M86P <W1Y;&4])VUA<F=I;BUL969T.BXU:6XG/CQS<&%N('-T>6QE M/2=F;VYT+7-I>F4Z,3 N,'!T.PT*;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M86PG/CQS<&%N('-T>6QE/2=M<V\M=&%B+6-O=6YT.C(G/J" H*" H*" H*" MH*" H*" H*" H*" (#PO<W!A;CX\<W!A; T*8VQA<W,]1W)A;44^8G)E86L\ M+W-P86X^.SQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L('-T>6QE/2=M87)G:6XM;&5F=#HN-6EN)SX\<W!A;B!S='EL93TG M9F]N="US:7IE.C$P+C!P=#L-"FUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M)SX\<W!A;B!S='EL93TG;7-O+71A8BUC;W5N=#HQ)SZ H*" H*" H*" H" \ M+W-P86X^?3QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L('-T>6QE/2=M87)G:6XM;&5F=#HN-6EN)SX\<W!A;B!S='EL93TG M9F]N="US:7IE.C$P+C!P=#L-"FUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M)SX\<W!A;B!S='EL93TG;7-O+71A8BUC;W5N=#HQ)SZ H*" H*" H*" H" \ M+W-P86X^/'-P86X-"F-L87-S/4=R86U%/FX\+W-P86X^*RL[/&\Z<#X\+V\Z M<#X M<F=I;BUL969T.BXU:6XG/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T M.PT*;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/GT\;SIP/CPO;SIP/CPO M9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^ M/&\Z<#XF;F)S<#L\+V\Z<#X M;W)M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO M<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SXO+U=H97)E M.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R M/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM<V\M M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^5&AI<PT*8V%N(&)E(&EM<')O=F5D M('1OA3QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R M;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP/CPO<W!A;CX\+W ^ M;B<^/'-P86X 8VQA<W,]1W)A;44^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z M,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SYI;G0\+W-P86X^ M:2UF;VYT+69A;6EL>3I!<FEA;"<^(&X],#L\;SIP/CPO;SIP/CPO<W!A;CX\ M+C5I;B<^/'-P86X 8VQA<W,]1W)A;44^/'-P86X-"G-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SYW:&EL93PO M<W!A;CX\+W-P86X^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS M;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX *&XF;'0[36%X("9A;7 [)F%M M<#L- M"CQP(&-L87-S/4US;TYO<FUA;"!S='EL93TG;6%R9VEN+6QE9G0Z+C5I;B<^ M+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\+W-P86X^/"]P/ T* M+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^:68\+W-P86X^/"]S M;VYT+69A;6EL>3I!<FEA;"<^("AN("$]($UA>"D >WT +R]4:&5N('1H90T* M=F%L=64 :7, 9F]U;F0 870 ;BTQ/&\Z<#X\+V\Z<#X\+W-P86X^/"]P/ T* M,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [ M/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N M('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY M87-S/4US;TYO<FUA;#X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^00T*8V]M<&%R:7-O;B!C86X M8F4 <V%V960 8GD ;6%K:6YG('1H92!L87-T(&-H87)A8W1E<B!I;B!T:&4 M<#X M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I MH" \+W-P86X^/&\Z<#X\+V\Z<#X M<V].;W)M86P <W1Y;&4])VUA<F=I;BUL969T.BXU:6XG/CQS<&%N(&-L87-S M/5-P96QL13X\<W!A; T*<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I M9&DM9F]N="UF86UI;'DZ07)I86PG/D$N;&5N9W1H/"]S<&%N/CPO<W!A;CX\ M<W!A; T*<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF M86UI;'DZ07)I86PG/B ](#QS<&%N(&-L87-S/5-P96QL13Y!+FQE;F=T:#PO M/4US;TYO<FUA;"!S='EL93TG;6%R9VEN+6QE9G0Z+C5I;B<^/'-P86X 8VQA M<W,]1W)A;44^/'-P86X-"G-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB M:61I+69O;G0M9F%M:6QY.D%R:6%L)SY!6SPO<W!A;CX\+W-P86X^/'-P86X- M"F-L87-S/5-P96QL13X\<W!A;B!S='EL93TG9F]N="US:7IE.C$P+C!P=#MM M<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^02YL96YG=& \+W-P86X^/"]S M;VYT+69A;6EL>3I!<FEA;"<^72 ](%-E87)C:#L\;SIP/CPO;SIP/CPO<W!A M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF;F)S<#L\+V\Z<#X\+W-P M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^:6YT M/"]S<&%N/CPO<W!A;CX\<W!A; T*<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[ M;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/B!N/3 [/&\Z<#X\+V\Z<#X\ M9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^ M+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^("A!6VXK*UTA/5-E M87)C:"D[/&\Z<#X\+V\Z<#X M;W)M86P <W1Y;&4])VUA<F=I;BUL969T.BXU:6XG/CQS<&%N('-T>6QE/2=F M;VYT+7-I>F4Z,3 N,'!T.PT*;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG M/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L('-T>6QE/2=M87)G:6XM;&5F=#HN-6EN)SX\<W!A;B!C;&%S<SU' M<F%M13X\<W!A; T*<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/FEF/"]S<&%N/CPO<W!A;CX\<W!A; T*<W1Y M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M86PG/B H;B A/2!-87 I('M]("\O5&AE;B!T:&4-"G9A;'5E(&ES(&9O=6YD M(&%T(&XM,3QO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O M3F]R;6%L('-T>6QE/2=M87)G:6XM;&5F=#HN-6EN)SX\<W!A;B!S='EL93TG M9F]N="US:7IE.C$P+C!P=#L-"FUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L M;TYO<FUA;"!S='EL93TG;6%R9VEN+6QE9G0Z+C5I;B<^/'-P86X 8VQA<W,] M:2UF;VYT+69A;6EL>3I!<FEA;"<^02YL96YG=& \+W-P86X^/"]S<&%N/CQS M;6EL>3I!<FEA;"<^(#T /'-P86X 8VQA<W,]4W!E;&Q%/D$N;&5N9W1H/"]S M<&%N/ T*+2 Q.SQO.G ^/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,] M37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB M:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\;SIP/B9N8G-P.SPO;SIP/CPO<W!A M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z M<#XF;F)S<#L\+V\Z<#X M86P^/&D^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/DIO96P-"D%N9&5R<V]N/&\Z<#X\+V\Z<#X\ M+W-P86X^/"]I/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R M/4US;TYO<FUA;#X\8B!S='EL93TG;7-O+6)I9&DM9F]N="UW96EG:'0Z;F]R M;6%L)SX\<W!A; T*<W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM M9F]N="UF86UI;'DZ07)I86PG/D0 4W1A8VMS/&\Z<#X\+V\Z<#X\+W-P86X^ M/"]B/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQB('-T>6QE/2=M<V\M M8FED:2UF;VYT+7=E:6=H=#IN M:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z<#XF M;F)S<#L\+V\Z<#X\+W-P86X^/"]B/CPO<#X-" T*/' 8VQA<W,]37-O3F]R M;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O M;'D 8V]N<W1R=6-T(&$ <W1A8VLZ/&\Z<#X\+V\Z<#X\+W-P86X^/"]P/ T* M93TG;7-O+7-P86-E<G5N.GEE<R<^H#PO<W!A;CX\;SIP/CPO;SIP/CPO<W!A M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/'-P M86X-"G-T>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ H*" (#PO<W!A;CX\<W!A M;B!C;&%S<SU'<F%M13YI;G1;/"]S<&%N/ET <W1A8VL[/&\Z<#X\+V\Z<#X\ M)V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG M+BXN/&\Z<#X\+V\Z<#X M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N M<R<^H*" H" \+W-P86X^/'-P86X 8VQA<W,]1W)A;44^<W1A8VL\+W-P86X^ M+W-P86X^+R\ <'5S:"!A('9A;'5E.SQO.G ^/"]O.G ^/"]S<&%N/CPO<#X- M" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z M,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SX\<W!A; T*<W1Y M;&4])VUS;RUS<&%C97)U;CIY97,G/J" H* /"]S<&%N/BXN+CQO.G ^/"]O M.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQS<&%N('-T M>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R M:6%L)SX\<W!A; T*<W1Y;&4])VUS;RUS<&%C97)U;CIY97,G/J /"]S<&%N M/CQS<&%N('-T>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ H* \+W-P86X^82 ] M(#QS M+3%=.SQS<&%N('-T>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ H* -"CPO<W!A M;CXO+R!G970 ;&%S="!E;&5M96YT/&\Z<#X\+V\Z<#X\+W-P86X^/"]P/ T* M93TG;7-O+7-P86-E<G5N.GEE<R<^H*" H" \+W-P86X^+BXN/&\Z<#X\+V\Z M<#X M;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I M86X^/'-P86X 8VQA<W,]4W!E;&Q%/G-T86-K+FQE;F=T:#PO<W!A;CX /2 \ M<W!A; T*8VQA<W,]4W!E;&Q%/G-T86-K+FQE;F=T:#PO<W!A;CX +2 Q.SQS M<&%N('-T>6QE/2=M<V\M<W!A8V5R=6XZ>65S)SZ H* -"CPO<W!A;CXO+R!P M;W ;&%S="!E;&5M96YT/&\Z<#X\+V\Z<#X M<W1Y;&4])VUA<F=I;BUT;W Z,3(N,'!T.VUA<F=I;BUR:6=H=#HP:6X[;6%R M9VEN+6)O='1O;3HS+C!P=#MM87)G:6XM;&5F=#H-"C!I;CMP86=E+6)R96%K M+6%F=&5R.F%V;VED)SX\<W!A;B!C;&%S<SU3<&5L;$4^/&D <W1Y;&4])VUS M+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY.D%R:6%L)SY0879E M;#PO M='EL93IN;W)M86PG/CQS<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS M;RUB:61I+69O;G0M9F%M:6QY. T*07)I86PG/B \<W!A;B!C;&%S<SU3<&5L M;$4^36EN87EE=CPO<W!A;CX /&\Z<#X\+V\Z<#X M.C!I;CMM87)G:6XM8F]T=&]M.C,N,'!T.VUA<F=I;BUL969T. T*,&EN.W!A M9V4M8G)E86LM869T97(Z879O:60G/CQB/CQS<&%N('-T>6QE/2=F;VYT+7-I M>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M:6QY. T*07)I86P[;7-O+69O M;G0M:V5R;FEN9SHQ-BXP<'0G/D0 ;F5W<V=R;W5P/&\Z<#X\+V\Z<#X\+W-P M93TG9F]N="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA M;VX ;F5W<RYD:6=I=&%L;6%R<RYC;VT <V5R=F5R/R!(97)E('EO=0T*8V%N M(&%S:R]S=6=G97-T(&%N>71H:6YG(&%B;W5T($0 86YD(&5V96X =&%L:R!T M;R!T:&4 8W)E871O<B!786QT97(N/&\Z<#X\+V\Z<#X\+W-P86X^/"]P/ T* M,"XP<'0[;7-O+6)I9&DM9F]N="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [ M/"]O.G ^/"]S<&%N/CPO<#X-" T*/' 8VQA<W,]37-O3F]R;6%L/CQI/CQS M<&%N('-T>6QE/2=F;VYT+7-I>F4Z,3 N,'!T.VUS;RUB:61I+69O;G0M9F%M M="US:7IE.C$P+C!P=#MM<V\M8FED:2UF;VYT+69A;6EL>3I!<FEA;"<^/&\Z M<#XF;F)S<#L\+V\Z<#X M86P^/'-P86X <W1Y;&4])V9O;G0M<VEZ93HQ,"XP<'0[;7-O+6)I9&DM9F]N M="UF86UI;'DZ07)I86PG/CQO.G ^)FYB<W [/"]O.G ^/"]S<&%N/CPO<#X- M" T*/' 8VQA<W,]37-O3F]R;6%L/CQO.G ^)FYB<W [/"]O.G ^/"]P/ T* ` end
Jun 14 2002
boundary="----=_NextPart_001_007C_01C21493.D7570E70" ------=_NextPart_001_007C_01C21493.D7570E70 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Ok, I've added Walters notes (c to d). I change the formatting (font = style) of those docs just to match the rest so once a standard is sorted = out a simple find/replace can be used. Should I keep sending things here? I was thinking that sending things = like this to the news would kind of rune the suprises in the first D = Journal (although I don't expect it to be out for some time yet). = Although I should mention that what I've done in notes so far isn't = worth a cats' wisker. So should I send updates to dmd synesis.com.au. Then later a few tech = editors can go though them.=20 Any new notes should be sent to me for the present (if that's ok with = you Matthew) and I'll append them to the list and forward them to = matthew. I'll kind of be like the inital filter, and anything really = stupid or grossly outside the guidelines I'll disgrard (informing the = sender). But I won't be doing much gramma or programming testing (unless = you want me too). Email: anderson firestar.com.au I'd be willing to do the same with tips as well, but by then you'll = probably have the submissions thedjournal.com ready. Parhaps you could = filter the submissions subject line and send any with notes in the = subject header to me. I'm probably just standing in the way. The amount = of submissions your submissions counter is probably minimal at the = moment anyway. ------=_NextPart_001_007C_01C21493.D7570E70 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META http-equiv=3DContent-Type content=3D"text/html; = charset=3Diso-8859-1"> <META content=3D"MSHTML 6.00.2716.2200" name=3DGENERATOR> <STYLE></STYLE> </HEAD> <BODY bgColor=3D#ffffff> <DIV><FONT face=3DArial size=3D2>Ok, I've added Walters notes (c to = d). I=20 change the formatting (font style) of those docs just to match the = rest so=20 once a standard is sorted out a simple find/replace can be = used.</FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Should I keep sending things here? I = was thinking=20 that sending things like this to the news would kind of rune the = suprises=20 </FONT><FONT face=3DArial size=3D2>in the first D Journal (although I = don't expect=20 it to be out for some time yet). <FONT face=3DArial = size=3D2>Although I should=20 mention that what I've done in notes so far isn't worth a cats'=20 wisker.</FONT></FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>So should I send updates to <A=20 href=3D"mailto:dmd synesis.com.au"><FONT = size=3D3>dmd synesis.com.au</FONT></A><FONT=20 size=3D3>. Then later a few tech editors can go though them. = </FONT></FONT></DIV> <DIV><FONT face=3DArial>Any new notes should be sent to me for the = present (if=20 that's ok with you Matthew) and I'll append them to the list = and=20 forward them to matthew. I'll kind of be like the inital filter, and = anything=20 really stupid or grossly outside the guidelines I'll disgrard (informing = the=20 sender). But I won't be doing much gramma or programming testing (unless = you=20 want me too).</FONT></DIV> <DIV><FONT face=3DArial></FONT> </DIV> <DIV><FONT face=3DArial><FONT size=3D2>Email: </FONT><A=20 href=3D"mailto:anderson firestar.com.au">anderson firestar.com.au</A></FO= NT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>I'd be willing to do the same with tips = as well,=20 but by then you'll probably have the <A=20 href=3D"mailto:submissions thedjournal.com"><FONT=20 size=3D3>submissions thedjournal.com</FONT></A> ready. Parhaps you = could=20 filter the submissions subject line and send any with notes in the = subject=20 header to me. I'm probably just standing in the way. The amount of=20 submissions your submissions counter is probably minimal at the moment=20 anyway.</FONT></DIV></BODY></HTML> ------=_NextPart_001_007C_01C21493.D7570E70--
Jun 15 2002
I would actually like it if the stuff purely about the D Journal website be moved to another newsgroup. I feel it's starting to clutter up the NG. This one is about the D *Language*. ;) Anyone? Maybe it'll just die down by itself. But I want it to thrive, just elsewhere. Maybe I'm wrong. Sean ====================== "anderson" <anderson firestar.com.au> wrote in message news:aef1q2$2evo$1 digitaldaemon.com... Ok, I've added Walters notes (c to d). I change the formatting (font style) of those docs just to match the rest so once a standard is sorted out a simple find/replace can be used. Should I keep sending things here? I was thinking that sending things like this to the news would kind of rune the suprises in the first D Journal (although I don't expect it to be out for some time yet). Although I should mention that what I've done in notes so far isn't worth a cats' wisker. So should I send updates to dmd synesis.com.au. Then later a few tech editors can go though them. Any new notes should be sent to me for the present (if that's ok with you Matthew) and I'll append them to the list and forward them to matthew. I'll kind of be like the inital filter, and anything really stupid or grossly outside the guidelines I'll disgrard (informing the sender). But I won't be doing much gramma or programming testing (unless you want me too). Email: anderson firestar.com.au I'd be willing to do the same with tips as well, but by then you'll probably have the submissions thedjournal.com ready. Parhaps you could filter the submissions subject line and send any with notes in the subject header to me. I'm probably just standing in the way. The amount of submissions your submissions counter is probably minimal at the moment anyway.
Jun 15 2002
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I wouldn't worry about that. I bet far more people will read the journal = than will read each of the posts here. "anderson" <anderson firestar.com.au> wrote in message = news:aef1q2$2evo$1 digitaldaemon.com... Should I keep sending things here? I was thinking that sending things = like this to the news would kind of rune the suprises in the first D = Journal (although I don't expect it to be out for some time yet). = Although I should mention that what I've done in notes so far isn't = worth a cats' wisker.
Jun 16 2002
Joel I see no reason why you, and everyone else, cannot start sending to submissions thedjournal.com. A call for papers will be posted on the group shortly, and then hopefully we can leave the group back with the language proper. Matthew "anderson" <anderson firestar.com.au> wrote in message news:aef1q2$2evo$1 digitaldaemon.com... Ok, I've added Walters notes (c to d). I change the formatting (font style) of those docs just to match the rest so once a standard is sorted out a simple find/replace can be used. Should I keep sending things here? I was thinking that sending things like this to the news would kind of rune the suprises in the first D Journal (although I don't expect it to be out for some time yet). Although I should mention that what I've done in notes so far isn't worth a cats' wisker. So should I send updates to dmd synesis.com.au. Then later a few tech editors can go though them. Any new notes should be sent to me for the present (if that's ok with you Matthew) and I'll append them to the list and forward them to matthew. I'll kind of be like the inital filter, and anything really stupid or grossly outside the guidelines I'll disgrard (informing the sender). But I won't be doing much gramma or programming testing (unless you want me too). Email: anderson firestar.com.au I'd be willing to do the same with tips as well, but by then you'll probably have the submissions thedjournal.com ready. Parhaps you could filter the submissions subject line and send any with notes in the subject header to me. I'm probably just standing in the way. The amount of submissions your submissions counter is probably minimal at the moment anyway.
Jun 17 2002
Then the following lines in the "Programming in D for C Programmers" must be wrong. I suppose Walter hasn't go around to updating it (Apr 21) and parhaps still plans to use this syntax later on. " The D Way D supports dynamic arrays, which can be easilly resized. D supports all the requisite memory management. int array[]; array[array.length++] = x; " "Pavel Minayev" <evilone omen.ru> wrote in message news:aedefn$gt7$1 digitaldaemon.com...It's an old story... you can only apply operator = to array.length. For example, all these lines are _invalid_: array.length++; array.length--; array.length += 123; array.length -= 321; The valid form is: array.length = array.length + 1; array.length = array.length - 1; Etc. Just don't ask me why - I didn't really understand Walter's arguments the last time we discussed it. =) By the way, one thing that might be classified as a tip is that D arraycanbe used to easily construct a stack: int[] stack; ... stack ~= 666; // push a value; ... a = stack[stack.length-1]; // get last element ... stack.length = stack.length - 1; // pop last element
Jun 14 2002
Oops! "anderson" <anderson firestar.com.au> wrote in message news:aee8qd$1adv$1 digitaldaemon.com...Then the following lines in the "Programming in D for C Programmers" mustbewrong. I suppose Walter hasn't go around to updating it (Apr 21) andparhapsstill plans to use this syntax later on. " The D Way D supports dynamic arrays, which can be easilly resized. D supports alltherequisite memory management. int array[]; array[array.length++] = x; " "Pavel Minayev" <evilone omen.ru> wrote in message news:aedefn$gt7$1 digitaldaemon.com...argumentsIt's an old story... you can only apply operator = to array.length. For example, all these lines are _invalid_: array.length++; array.length--; array.length += 123; array.length -= 321; The valid form is: array.length = array.length + 1; array.length = array.length - 1; Etc. Just don't ask me why - I didn't really understand Walter'sthe last time we discussed it. =) By the way, one thing that might be classified as a tip is that D arraycanbe used to easily construct a stack: int[] stack; ... stack ~= 666; // push a value; ... a = stack[stack.length-1]; // get last element ... stack.length = stack.length - 1; // pop last element
Jun 16 2002
Didn't anyone noticed that the following example is not valid not only for current DMD (as long as Walter doesn't allow ++ on properties) but is simply *buggy*?int array[]; array[array.length++] = x;AFAIK, the sequence of event will be: array[array.length] = x; array.length=array.length+1; And it is simply not valid array expanding. It's a bug which in the best case will give GPF (in the worst it silently corrupts memory). In fact, the sequence should be: array.length=array.length+1; array[array.length-1] = x; which corresponds to array[(++array.length)-1] = x; And after all, I really think that form is not very good. I agree that properties should have only gettors and settors, and ++, --, etc, should not be used with them. Nic Tiger. "anderson" <anderson firestar.com.au> wrote in message news:aee8qd$1adv$1 digitaldaemon.com...Then the following lines in the "Programming in D for C Programmers" mustbewrong. I suppose Walter hasn't go around to updating it (Apr 21) andparhapsstill plans to use this syntax later on. " The D Way D supports dynamic arrays, which can be easilly resized. D supports alltherequisite memory management. int array[]; array[array.length++] = x; "
Jun 17 2002
You're right. Thanks for catching this egregious error. "Nic Tiger" <nictiger pt.comcor.ru> wrote in message news:aemia1$1ap7$1 digitaldaemon.com...Didn't anyone noticed that the following example is not valid not only for current DMD (as long as Walter doesn't allow ++ on properties) but issimply*buggy*?theint array[]; array[array.length++] = x;AFAIK, the sequence of event will be: array[array.length] = x; array.length=array.length+1; And it is simply not valid array expanding. It's a bug which in the best case will give GPF (in the worst it silently corrupts memory). In fact,sequence should be: array.length=array.length+1; array[array.length-1] = x; which corresponds to array[(++array.length)-1] = x; And after all, I really think that form is not very good. I agree that properties should have only gettors and settors, and ++, --, etc, shouldnotbe used with them. Nic Tiger.
Jun 18 2002
On Tue, 18 Jun 2002 10:06:23 +0400 "Nic Tiger" <nictiger pt.comcor.ru> wrote:Didn't anyone noticed that the following example is not valid not only for current DMD (as long as Walter doesn't allow ++ on properties) but is simply *buggy*?Isn't subscript expression supposed to be calculated BEFORE the subscript operator itself gets called???int array[]; array[array.length++] = x;AFAIK, the sequence of event will be: array[array.length] = x; array.length=array.length+1; And it is simply not valid array expanding. It's a bug which in the best case will give GPF (in the worst it silently corrupts memory). In fact, the
Jun 18 2002
Посмотрел ASM, который генерируется, и вынужден согласиться. По крайней мере для int[5] p; int ind=3; p[ind++] = 100; последовательность команд tmp=ind; ind ++; p[tmp] = 100; Nic Tiger. "Pavel Minayev" <evilone omen.ru> wrote in message news:CFN374255125238194 news.digitalmars.com...On Tue, 18 Jun 2002 10:06:23 +0400 "Nic Tiger" <nictiger pt.comcor.ru>wrote:forDidn't anyone noticed that the following example is not valid not onlysimplycurrent DMD (as long as Walter doesn't allow ++ on properties) but isthe*buggy*?int array[]; array[array.length++] = x;AFAIK, the sequence of event will be: array[array.length] = x; array.length=array.length+1; And it is simply not valid array expanding. It's a bug which in the best case will give GPF (in the worst it silently corrupts memory). In fact,Isn't subscript expression supposed to be calculated BEFORE the subscript operator itself gets called???
Jun 18 2002
"Nic Tiger" <nictiger pt.comcor.ru> wrote in message news:aemia1$1ap7$1 digitaldaemon.com...Didn't anyone noticed that the following example is not valid not only for current DMD (as long as Walter doesn't allow ++ on properties) but issimply*buggy*?No it should evaluate to: int tmp = array.length; array.length = array.length+1; array[tmp] = x; Due to operator precedence.int array[]; array[array.length++] = x;AFAIK, the sequence of event will be: array[array.length] = x; array.length=array.length+1;And it is simply not valid array expanding. It's a bug which in the best case will give GPF (in the worst it silently corrupts memory). In fact,thesequence should be: array.length=array.length+1; array[array.length-1] = x; which corresponds to array[(++array.length)-1] = x;That's fine, it's the same thing but probably won't optimize as well. A compiler could be made that would check for this case, of course.And after all, I really think that form is not very good. I agree that properties should have only gettors and settors, and ++, --, etc, shouldnotbe used with them.Perhaps they shouldn't be in the base language either. ++ on int, is it more clear to be x = x + 1 ?Nic Tiger.
Jun 18 2002
Yer I was thinking that too. I saw it on th D page and couldn't work out why it worked. Well that makes it impossible to go array[array.length++] = foo(); I'd have to be, array[(++array.length)-1] = foo(); Instead, which is kinda longer hand anyway. I still think that ++ -- += -= should be allowed somehow with properties. Well *sigh* I'll have to wait for language E to include that.
Jun 18 2002
anderson wrote:Yer I was thinking that too. I saw it on th D page and couldn't work out why it worked. Well that makes it impossible to go array[array.length++] = foo(); I'd have to be, array[(++array.length)-1] = foo();No - disinformation sure spreads quickly. Nic was right but for the wrong reason: C and D have very wide flexibility in subexpression evaluation order. The first example can be implemented as any of: array.length += 1; array [array.length - 1] = foo (); array [array.length] = foo (); array.length += 1; array [(array.length += 1) - 1] = foo (); Or any of the multitude of combinations that assembly provides, and the second example is no better. The only guarantee that C and D make is that if you modify the value of a parameter, the side-effect will be stored in memory by the end of the expression (or the next sequence point, such as || and && and some others that may not be sequence points in D). C also adds that if you read and write a variable in the same sequence, the result is undefined, meaning 42 can always be the answer above in C. D's a little more explicit: "If the compiler can determine that the result of an expression is illegally dependent on the order of evaluation, it can issue an error (but is not required to). The ability to detect these kinds of errors is a quality of implementation issue." Unfortunately it's very easy for it to become impossible to unambiguously determine whether there's a subexpression evaluation order dependency when functions and methods are involved, but when they do occur you should assume it's going to yield 42. The comp.lang.c FAQ (ftp://ftp.eskimo.com/u/s/scs/C-faq/faq) devotes questions 3.1 to 3.9 to this issue.Instead, which is kinda longer hand anyway. I still think that ++ -- += -= should be allowed somehow with properties. Well *sigh* I'll have to wait for language E to include that.Agreed, this should be allowed.
Jun 18 2002
Thanks, I learn something! --Isn't it odd that you learn more about C in a D newsgroup. "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0F49CF.5060908 users.sourceforge.net...anderson wrote:whyYer I was thinking that too. I saw it on th D page and couldn't work outproperties.it worked. Well that makes it impossible to go array[array.length++] = foo(); I'd have to be, array[(++array.length)-1] = foo();No - disinformation sure spreads quickly. Nic was right but for the wrong reason: C and D have very wide flexibility in subexpression evaluation order. The first example can be implemented as any of: array.length += 1; array [array.length - 1] = foo (); array [array.length] = foo (); array.length += 1; array [(array.length += 1) - 1] = foo (); Or any of the multitude of combinations that assembly provides, and the second example is no better. The only guarantee that C and D make is that if you modify the value of a parameter, the side-effect will be stored in memory by the end of the expression (or the next sequence point, such as || and && and some others that may not be sequence points in D). C also adds that if you read and write a variable in the same sequence, the result is undefined, meaning 42 can always be the answer above in C. D's a little more explicit: "If the compiler can determine that the result of an expression is illegally dependent on the order of evaluation, it can issue an error (but is not required to). The ability to detect these kinds of errors is a quality of implementation issue." Unfortunately it's very easy for it to become impossible to unambiguously determine whether there's a subexpression evaluation order dependency when functions and methods are involved, but when they do occur you should assume it's going to yield 42. The comp.lang.c FAQ (ftp://ftp.eskimo.com/u/s/scs/C-faq/faq) devotes questions 3.1 to 3.9 to this issue.Instead, which is kinda longer hand anyway. I still think that ++ -- += -= should be allowed somehow withWell *sigh* I'll have to wait for language E to include that.Agreed, this should be allowed.
Jun 18 2002
"anderson" <anderson firestar.com.au> wrote in message news:aenkra$2er4$1 digitaldaemon.com...Thanks, I learn something! --Isn't it odd that you learn more about C in a D newsgroup.It's not that unusual. One way to really learn a language is to try and learn another one. It puts a whole new perspective on behaviors once taken for granted.
Jul 06 2002
"Walter" <walter digitalmars.com> wrote in message news:ag71uu$12vi$1 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:aenkra$2er4$1 digitaldaemon.com...Well that was my underlining point. You read between the lines GREAT!Thanks, I learn something! --Isn't it odd that you learn more about C in a D newsgroup.It's not that unusual. One way to really learn a language is to try and learn another one. It puts a whole new perspective on behaviors once taken for granted.
Jul 06 2002
Why doesn't D specify what the behavior is for ++ and --, exactly? Why leave this open to interpretation in the implementation? That just creates subtle portability bugs. Sean "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0F49CF.5060908 users.sourceforge.net...anderson wrote:whyYer I was thinking that too. I saw it on th D page and couldn't work outproperties.it worked. Well that makes it impossible to go array[array.length++] = foo(); I'd have to be, array[(++array.length)-1] = foo();No - disinformation sure spreads quickly. Nic was right but for the wrong reason: C and D have very wide flexibility in subexpression evaluation order. The first example can be implemented as any of: array.length += 1; array [array.length - 1] = foo (); array [array.length] = foo (); array.length += 1; array [(array.length += 1) - 1] = foo (); Or any of the multitude of combinations that assembly provides, and the second example is no better. The only guarantee that C and D make is that if you modify the value of a parameter, the side-effect will be stored in memory by the end of the expression (or the next sequence point, such as || and && and some others that may not be sequence points in D). C also adds that if you read and write a variable in the same sequence, the result is undefined, meaning 42 can always be the answer above in C. D's a little more explicit: "If the compiler can determine that the result of an expression is illegally dependent on the order of evaluation, it can issue an error (but is not required to). The ability to detect these kinds of errors is a quality of implementation issue." Unfortunately it's very easy for it to become impossible to unambiguously determine whether there's a subexpression evaluation order dependency when functions and methods are involved, but when they do occur you should assume it's going to yield 42. The comp.lang.c FAQ (ftp://ftp.eskimo.com/u/s/scs/C-faq/faq) devotes questions 3.1 to 3.9 to this issue.Instead, which is kinda longer hand anyway. I still think that ++ -- += -= should be allowed somehow withWell *sigh* I'll have to wait for language E to include that.Agreed, this should be allowed.
Jun 18 2002
Couldn't agree more. What's the rationale? "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aenvfs$2qap$1 digitaldaemon.com...Why doesn't D specify what the behavior is for ++ and --, exactly? Why leave this open to interpretation in the implementation? That justcreatessubtle portability bugs. Sean "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0F49CF.5060908 users.sourceforge.net...outanderson wrote:Yer I was thinking that too. I saw it on th D page and couldn't workwhyproperties.it worked. Well that makes it impossible to go array[array.length++] = foo(); I'd have to be, array[(++array.length)-1] = foo();No - disinformation sure spreads quickly. Nic was right but for the wrong reason: C and D have very wide flexibility in subexpression evaluation order. The first example can be implemented as any of: array.length += 1; array [array.length - 1] = foo (); array [array.length] = foo (); array.length += 1; array [(array.length += 1) - 1] = foo (); Or any of the multitude of combinations that assembly provides, and the second example is no better. The only guarantee that C and D make is that if you modify the value of a parameter, the side-effect will be stored in memory by the end of the expression (or the next sequence point, such as || and && and some others that may not be sequence points in D). C also adds that if you read and write a variable in the same sequence, the result is undefined, meaning 42 can always be the answer above in C. D's a little more explicit: "If the compiler can determine that the result of an expression is illegally dependent on the order of evaluation, it can issue an error (but is not required to). The ability to detect these kinds of errors is a quality of implementation issue." Unfortunately it's very easy for it to become impossible to unambiguously determine whether there's a subexpression evaluation order dependency when functions and methods are involved, but when they do occur you should assume it's going to yield 42. The comp.lang.c FAQ (ftp://ftp.eskimo.com/u/s/scs/C-faq/faq) devotes questions 3.1 to 3.9 to this issue.Instead, which is kinda longer hand anyway. I still think that ++ -- += -= should be allowed somehow withWell *sigh* I'll have to wait for language E to include that.Agreed, this should be allowed.
Jun 18 2002
Sean L. Palmer wrote:Why doesn't D specify what the behavior is for ++ and --, exactly? Why leave this open to interpretation in the implementation? That justcreatessubtle portability bugs.C and D also don't define the order of subexpression evaluation in function arguments or what order the functions in "a () + b () * c ()" will be evaluated in. The reasons are: - These orders depend upon the style and behaviour of your parser. - It depends upon what order the function arguments are built in. - The machine code may be way more efficient in doing one order than in doing the other, not just globally but locally to this one expression. - Optimising often desires to change it, and can do much more in D than in C. The C rules were very confusing anyway. - Any hard decision on subexpression evaluation order would be as arbitrary as the next. - The only people it affects are those who should be more careful programmers. The comp.lang.c freaks are the ones to go to for a full set, but the issues haven't changed from C to D: If something must be portably done before or after something else it must be in a separate sequence or expression.
Jun 20 2002
Yes, you're right. "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D121EAA.4030501 users.sourceforge.net...Sean L. Palmer wrote: > Why doesn't D specify what the behavior is for ++ and --, exactly? Why > leave this open to interpretation in the implementation? That just creates > subtle portability bugs. C and D also don't define the order of subexpression evaluation in function arguments or what order the functions in "a () + b () * c ()" will be evaluated in. The reasons are: - These orders depend upon the style and behaviour of your parser. - It depends upon what order the function arguments are built in. - The machine code may be way more efficient in doing one order than in doing the other, not just globally but locally to this one expression. - Optimising often desires to change it, and can do much more in D than in C. The C rules were very confusing anyway. - Any hard decision on subexpression evaluation order would be as arbitrary as the next. - The only people it affects are those who should be more careful programmers. The comp.lang.c freaks are the ones to go to for a full set, but the issues haven't changed from C to D: If something must be portably done before or after something else it must be in a separate sequence or expression.
Jul 06 2002
Walter have you considered adding these properties to arrays? int a[]; a.first (same as a[0], error if empty?) a.last (same as a[a.length -1], error if empty?) a.push (a special reference..if you store here it goes on the end of the darray) a.pop (returns and pops the last item off a darray) a fpush (push onto the beginning) a.fpop (pop from the beginning) They're just handy shortcuts if nothing else, but the C++ STL shows they have some value. FWIW I recommend making assignable and readable properties, including user defined ones, to support +=, -=, ++, -- just to keep them grammatically compatible with normal variables. Sean "Pavel Minayev" <evilone omen.ru> wrote in message news:aedefn$gt7$1 digitaldaemon.com...It's an old story... you can only apply operator = to array.length. For example, all these lines are _invalid_: array.length++; array.length--; array.length += 123; array.length -= 321; The valid form is: array.length = array.length + 1; array.length = array.length - 1; Etc. Just don't ask me why - I didn't really understand Walter's arguments the last time we discussed it. =) By the way, one thing that might be classified as a tip is that D arraycanbe used to easily construct a stack: int[] stack; ... stack ~= 666; // push a value; ... a = stack[stack.length-1]; // get last element ... stack.length = stack.length - 1; // pop last element
Jun 15 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aef5qq$2iqh$1 digitaldaemon.com...Walter have you considered adding these properties to arrays? int a[]; a.first (same as a[0], error if empty?) a.last (same as a[a.length -1], error if empty?) a.push (a special reference..if you store here it goes on the end of the darray) a.pop (returns and pops the last item off a darray) a fpush (push onto the beginning) a.fpop (pop from the beginning) They're just handy shortcuts if nothing else, but the C++ STL shows they have some value.They do add some value, but at the moment I want to err on the side of a minimal set of properties. Let's see where things fall out over time.FWIW I recommend making assignable and readable properties, including user defined ones, to support +=, -=, ++, -- just to keep them grammatically compatible with normal variables.The reason I wished to avoid that was so that people would be less likely to write: for (i = 0; i < n; i++) array[array.length++] = foo(); which results in terrible performance. Reallocating an array is a fairly expensive operation, and the syntax for it shouldn't appear like it *belongs* in a loop like that.
Jun 16 2002
Isn't that gonna make a lot of other writeable properties hard to use? The syntax is shared for all properties (including user-defined ones, if I'm right) so it seems to make sense to make it flexible for use by user properties which should work just like normal variables correct? Sean "Walter" <walter digitalmars.com> wrote in message news:aejn59$t00$1 digitaldaemon.com..."Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aef5qq$2iqh$1 digitaldaemon.com...theWalter have you considered adding these properties to arrays? int a[]; a.first (same as a[0], error if empty?) a.last (same as a[a.length -1], error if empty?) a.push (a special reference..if you store here it goes on the end ofuserdarray) a.pop (returns and pops the last item off a darray) a fpush (push onto the beginning) a.fpop (pop from the beginning) They're just handy shortcuts if nothing else, but the C++ STL shows they have some value.They do add some value, but at the moment I want to err on the side of a minimal set of properties. Let's see where things fall out over time.FWIW I recommend making assignable and readable properties, includingtodefined ones, to support +=, -=, ++, -- just to keep them grammatically compatible with normal variables.The reason I wished to avoid that was so that people would be less likelywrite: for (i = 0; i < n; i++) array[array.length++] = foo(); which results in terrible performance. Reallocating an array is a fairly expensive operation, and the syntax for it shouldn't appear like it *belongs* in a loop like that.
Jun 17 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aek6k2$1d57$1 digitaldaemon.com...Isn't that gonna make a lot of other writeable properties hard to use?Thesyntax is shared for all properties (including user-defined ones, if I'm right) so it seems to make sense to make it flexible for use by user properties which should work just like normal variables correct?I think the .length property is going to wind up being a special case. (I hate special cases.)
Jun 17 2002
So don't put them in. Sean "Walter" <walter digitalmars.com> wrote in message news:aeluv6$o6r$1 digitaldaemon.com..."Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aek6k2$1d57$1 digitaldaemon.com...Isn't that gonna make a lot of other writeable properties hard to use?Thesyntax is shared for all properties (including user-defined ones, if I'm right) so it seems to make sense to make it flexible for use by user properties which should work just like normal variables correct?I think the .length property is going to wind up being a special case. (I hate special cases.)
Jun 18 2002
I wish it were that easy. Compromises are inevitable to satisfy conflicting design goals. For another example, I'd like to make the grammar for D LALR(1), but then it would diverge too far from C's grammar. "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aemosu$1iho$1 digitaldaemon.com...So don't put them in. Sean "Walter" <walter digitalmars.com> wrote in message news:aeluv6$o6r$1 digitaldaemon.com...(II think the .length property is going to wind up being a special case.hate special cases.)
Jun 18 2002
I don't agree. Any decent programmer with half a brain would beable to notice that one. Besides, what's going to stop them from doing ... for (i = 0; i < n; i++) { array.length = array.length + 1; array[n] = foo(); } or for (i = 0; i < n; i++) { array.length = n + 1; array[n] = foo(); } and it may be nice to do this sometimes for (i = 0; i < n; i++) if (Something) array[array.length++] = foo(); Besides, can't the array.length++ be optimised slightly in the complier because it doesn't have to do lower bound checks? Although I suppose the complier could probably detect array.length = array.length + 1 as the same thing. Keeping properties the same as variables would make life easier for beginners who tradionaly don't care about performace until they evolve into a "Complier Walter" -> advanced programmer. Parhaps there's another way to solve that bad coding problem ????? "Walter" <walter digitalmars.com> wrote in message news:aejn59$t00$1 digitaldaemon.com..."Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aef5qq$2iqh$1 digitaldaemon.com...theWalter have you considered adding these properties to arrays? int a[]; a.first (same as a[0], error if empty?) a.last (same as a[a.length -1], error if empty?) a.push (a special reference..if you store here it goes on the end ofuserdarray) a.pop (returns and pops the last item off a darray) a fpush (push onto the beginning) a.fpop (pop from the beginning) They're just handy shortcuts if nothing else, but the C++ STL shows they have some value.They do add some value, but at the moment I want to err on the side of a minimal set of properties. Let's see where things fall out over time.FWIW I recommend making assignable and readable properties, includingtodefined ones, to support +=, -=, ++, -- just to keep them grammatically compatible with normal variables.The reason I wished to avoid that was so that people would be less likelywrite: for (i = 0; i < n; i++) array[array.length++] = foo(); which results in terrible performance. Reallocating an array is a fairly expensive operation, and the syntax for it shouldn't appear like it *belongs* in a loop like that.
Jun 17 2002
"anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...Besides, can't the array.length++ be optimised slightly in the complier because it doesn't have to do lower bound checks? Although I suppose the complier could probably detect array.length = array.length + 1 as the same thing. Keeping properties the same as variables would make life easier for beginners who tradionaly don't care about performace until they evolveintoa "Complier Walter" -> advanced programmer. Parhaps there's another way to solve that bad coding problem ?????Yeah... speed up array reallocation. ;) That's what Walter's afraid of I guess. I just don't see the potential misuse of a otherwise useful feature as grounds for not including it in the language. Most people wouldn't care. They'd write it, it'd be slow, and they'd not care or in fact even notice. Only us speed freaks care, and we would never write slop such as that because part of caring about performance is understanding what the compiler is transforming your code into. Most "normal" programmers would think it runs "fast enough". ;) Sean
Jun 17 2002
That reminds me of what we used to do in C to speed up malloc/realloc. Block allocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) and then it'd only need to update when it gets passed that number again. Even C++'s vector did that. Futhermore the GC could trim arrays that haven't recently been updated/resized. That'd probably lead to some speedups in code that normally have to be coded that way, anyway. "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:ael7ve$163$1 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...sameBesides, can't the array.length++ be optimised slightly in the complier because it doesn't have to do lower bound checks? Although I suppose the complier could probably detect array.length = array.length + 1 as thecompilerthing. Keeping properties the same as variables would make life easier for beginners who tradionaly don't care about performace until they evolveintoa "Complier Walter" -> advanced programmer. Parhaps there's another way to solve that bad coding problem ?????Yeah... speed up array reallocation. ;) That's what Walter's afraid of I guess. I just don't see the potential misuse of a otherwise useful feature as grounds for not including it in the language. Most people wouldn't care. They'd write it, it'd be slow, and they'd not care or in fact even notice. Only us speed freaks care, and we would never write slop such as that because part of caring about performance is understanding what theis transforming your code into. Most "normal" programmers would think it runs "fast enough". ;) Sean
Jun 17 2002
Koenig showed in (can't remember reference) that reallocation by 150% is the best balance of speed/size. I would be quite happy with that. I enhanced that in a string class to act only from the second allocation onwards, i.e.. the first allocation is exact, in order to deal with constant strings. The same could be applied to any array type "anderson" <anderson firestar.com.au> wrote in message news:ael937$2qm$1 digitaldaemon.com...That reminds me of what we used to do in C to speed up malloc/realloc.Blockallocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) andthenit'd only need to update when it gets passed that number again. Even C++'s vector did that. Futhermore the GC could trim arrays that haven't recently been updated/resized. That'd probably lead to some speedups in code thatnormallyhave to be coded that way, anyway. "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:ael7ve$163$1 digitaldaemon.com...complier"anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...Besides, can't the array.length++ be optimised slightly in thethebecause it doesn't have to do lower bound checks? Although I supposenotsamecomplier could probably detect array.length = array.length + 1 as thething. Keeping properties the same as variables would make life easier for beginners who tradionaly don't care about performace until they evolveintoa "Complier Walter" -> advanced programmer. Parhaps there's another way to solve that bad coding problem ?????Yeah... speed up array reallocation. ;) That's what Walter's afraid of I guess. I just don't see the potential misuse of a otherwise useful feature as grounds for not including it in the language. Most people wouldn't care. They'd write it, it'd be slow, and they'dcare or in fact even notice. Only us speed freaks care, and we would never write slop such as that because part of caring about performance is understanding what thecompileris transforming your code into. Most "normal" programmers would think it runs "fast enough". ;) Sean
Jun 17 2002
It's not however the best balance of wasted memory (the memory allocated but never used or detected as "wasted") I was thinking this over the other day and by the time you get to 5 or 6 it should start giving you one extra...at about 12 it should give you 2 extra. Think about it this way. You're working with modules that are so big that (or memory is so tight that) if one extra gets allocated, the game won't run (it will run out of memory and crash). How many of those are you likely to be allocating. If it's so big that allocating only 1 will be possible, you obviously want no extras. If you can fit 2, good, but still wouldn't want to bet on having room for one more. But say they've allocated 3 already. Will they allocate more or not? It's the gamble. It may be that they only had enough memory for 3 of them. Or it could be the start of a very big pattern. I think that by about 4 you can be pretty sure they are small enough that if you allocate one extra it might not be such a big problem. Or perhaps the allocator could be based on size of object. Really large objects don't allocate as many in advance. The smaller, the more likely to allocate more in advance (down to the optimal 1.5x approach). For byte sizes I'd have it start out allocating 4 or 8 more just in case. The heap structure usually needs this much alignment anyway. At size 4 bytes I'd start allocating exactly how many they asked for times 2. 2.0x growth (round down). For a 64K object, probably wouldn't want any extra preallocation (but you *might!*) And somewhere in between is the 150%, probably at about the OS page level or cacheline level. This could be info that the profiler could provide. In fact, a standard allocator could perhaps be instructed to analyze usage patterns and come up with recommended allocation strategy percentage as a result (modify its "prediction" over time). If you pluck these values out from the debugger after letting the program run for a while you can drop that number in during initialization to give the allocator a "hint" as to how you're going to be using it ("I'm going to be allocating a bunch of these" == 10.0x or more and "This is a singleton" == 0.0x) In any case the allocator would be able to modify the number over time if it wished so it could be self-correcting. For that the allocator would need access to some kind of timer (to tell the difference between 1 allocation per frame and 10000 allocations per frame). Perhaps it could be a method allocator.time_elapsed(1000); // 1 second in milliseconds During which it could update its prediction value. Default would be about 1.25. I tried some functions with log, and you *way* don't want to go there. Exponentiation is not the thing we're after here. This would need to be a compiler switch probably (memory allocation prediction factor). Or a configurable parameter of a standard allocator. Sean "Matthew Wilson" <dmd synesis.com.au> wrote in message news:aellgq$fgj$2 digitaldaemon.com...Koenig showed in (can't remember reference) that reallocation by 150% isthebest balance of speed/size. I would be quite happy with that. I enhanced that in a string class to act only from the second allocation onwards, i.e.. the first allocation is exact, in order to deal withconstantstrings. The same could be applied to any array type
Jun 18 2002
You sounds to be agreeing violently with me, or is is too late in the day? "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aemmca$1fpa$1 digitaldaemon.com...It's not however the best balance of wasted memory (the memory allocatedbutnever used or detected as "wasted") I was thinking this over the other day and by the time you get to 5 or 6itshould start giving you one extra...at about 12 it should give you 2extra.Think about it this way. You're working with modules that are so big that (or memory is so tight that) if one extra gets allocated, the game won'trun(it will run out of memory and crash). How many of those are you likelytobe allocating. If it's so big that allocating only 1 will be possible, you obviously want no extras. If you can fit 2, good, but still wouldn't want to bet on having room for one more. But say they've allocated 3 already. Will they allocate more or not?It'sthe gamble. It may be that they only had enough memory for 3 of them. Or it could be the start of a very big pattern. I think that by about 4 you can be pretty sure they are small enough thatifyou allocate one extra it might not be such a big problem. Or perhaps the allocator could be based on size of object. Really large objects don't allocate as many in advance. The smaller, the more likelytoallocate more in advance (down to the optimal 1.5x approach). For byte sizes I'd have it start out allocating 4 or 8 more just in case. The heap structure usually needs this much alignment anyway. At size 4 bytes I'd start allocating exactly how many they asked for times 2. 2.0x growth (round down). For a 64K object, probably wouldn't want any extra preallocation (but you *might!*) And somewhere in between is the 150%, probably at about the OS page level or cacheline level. This could beinfothat the profiler could provide. In fact, a standard allocator could perhaps be instructed to analyze usage patterns and come up withrecommendedallocation strategy percentage as a result (modify its "prediction" over time). If you pluck these values out from the debugger after letting the program run for a while you can drop that number in during initializationtogive the allocator a "hint" as to how you're going to be using it ("I'm going to be allocating a bunch of these" == 10.0x or more and "This is a singleton" == 0.0x) In any case the allocator would be able to modify the number over time if it wished so it could be self-correcting. For thattheallocator would need access to some kind of timer (to tell the difference between 1 allocation per frame and 10000 allocations per frame). Perhapsitcould be a method allocator.time_elapsed(1000); // 1 second in milliseconds During which it could update its prediction value. Default would be about 1.25. I tried some functions with log, and you *way* don't want to go there. Exponentiation is not the thing we're after here. This would need to be a compiler switch probably (memory allocation prediction factor). Or a configurable parameter of a standard allocator. Sean "Matthew Wilson" <dmd synesis.com.au> wrote in message news:aellgq$fgj$2 digitaldaemon.com...Koenig showed in (can't remember reference) that reallocation by 150% isthebest balance of speed/size. I would be quite happy with that. I enhanced that in a string class to act only from the second allocation onwards, i.e.. the first allocation is exact, in order to deal withconstantstrings. The same could be applied to any array type
Jun 18 2002
I guess I'm only disagreeing about the percentage. 150% of 1 is 1 .. 150% of 2 is 3 (0+1)*1.5 = 1 (1+1)*1.5 = 3 (3+1)*1.5 = 6 Or are you doing it like so: 1.5*0+1 = 1 1.5*1+1 = 2 1.5*2+1 = 4 But 1.25 would work more like this: 1.25*0+1 = 1 1.25*1+1 = 2 1.25*2+1 = 3 1.25*3+1 = 4 1.25*4+1 = 6 especially if the allocation is big. But don't get me wrong, 150% is a fine choice and will work most of the time and you're probably right about the long-term growth characteristics. Sean "Matthew Wilson" <matthew thedjournal.com> wrote in message news:aemmi3$1fuo$1 digitaldaemon.com...You sounds to be agreeing violently with me, or is is too late in the day? "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aemmca$1fpa$1 digitaldaemon.com...thatIt's not however the best balance of wasted memory (the memory allocatedbutnever used or detected as "wasted") I was thinking this over the other day and by the time you get to 5 or 6itshould start giving you one extra...at about 12 it should give you 2extra.Think about it this way. You're working with modules that are so bigwant(or memory is so tight that) if one extra gets allocated, the game won'trun(it will run out of memory and crash). How many of those are you likelytobe allocating. If it's so big that allocating only 1 will be possible, you obviouslyforno extras. If you can fit 2, good, but still wouldn't want to bet on having roomOrone more. But say they've allocated 3 already. Will they allocate more or not?It'sthe gamble. It may be that they only had enough memory for 3 of them.thatit could be the start of a very big pattern. I think that by about 4 you can be pretty sure they are small enoughifheapyou allocate one extra it might not be such a big problem. Or perhaps the allocator could be based on size of object. Really large objects don't allocate as many in advance. The smaller, the more likelytoallocate more in advance (down to the optimal 1.5x approach). For byte sizes I'd have it start out allocating 4 or 8 more just in case. Thethestructure usually needs this much alignment anyway. At size 4 bytes I'd start allocating exactly how many they asked for times 2. 2.0x growth (round down). For a 64K object, probably wouldn't want any extra preallocation (but you *might!*) And somewhere in between is the 150%, probably at about the OS page level or cacheline level. This could beinfothat the profiler could provide. In fact, a standard allocator could perhaps be instructed to analyze usage patterns and come up withrecommendedallocation strategy percentage as a result (modify its "prediction" over time). If you pluck these values out from the debugger after lettinginitializationprogram run for a while you can drop that number in duringtothegive the allocator a "hint" as to how you're going to be using it ("I'm going to be allocating a bunch of these" == 10.0x or more and "This is a singleton" == 0.0x) In any case the allocator would be able to modifydifferencenumber over time if it wished so it could be self-correcting. For thattheallocator would need access to some kind of timer (to tell thePerhapsbetween 1 allocation per frame and 10000 allocations per frame).itaboutcould be a method allocator.time_elapsed(1000); // 1 second in milliseconds During which it could update its prediction value. Default would beallocator.1.25. I tried some functions with log, and you *way* don't want to go there. Exponentiation is not the thing we're after here. This would need to be a compiler switch probably (memory allocation prediction factor). Or a configurable parameter of a standardisSean "Matthew Wilson" <dmd synesis.com.au> wrote in message news:aellgq$fgj$2 digitaldaemon.com...Koenig showed in (can't remember reference) that reallocation by 150%allocationthebest balance of speed/size. I would be quite happy with that. I enhanced that in a string class to act only from the secondonwards, i.e.. the first allocation is exact, in order to deal withconstantstrings. The same could be applied to any array type
Jun 18 2002
anderson wrote:That reminds me of what we used to do in C to speed up malloc/realloc. Block allocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) and then it'd only need to update when it gets passed that number again.Python uses a specific function for overallocation that they claim gives linear reallocation speed on poorly performing reallocs, such as, uh, Windows'. I stuffed that in my realloc wrapper function so now I just reallocate everything up by one, secure in the knowledge that it'll be fast. The function is: static int __roundupsize (int n) { unsigned int nbits = 0; unsigned int n2 = (unsigned int) n >> 5; do { n2 >>= 3; nbits += 3; } while (n2); return ((n >> nbits) + 1) << nbits; } Python's source goes into its behaviour and results and I can dig that up if it's wanted. Arrays could be given a third integer for maximum that's set to length in slices and static arrays but is overallocated otherwise. Once it tops it, allocate the new array and copy it over. Resizing to lower lengths causes maximum to equal length, as it's essentially a slice operator. One real problem that comes up is in multiple array references: a = foo; /* foo is a dynamic array */ b = foo; a ~= 4; b ~= 8; a [a.length - 1] == 8 or == 4 depending upon whether (maximum != length) before the append. One solution would be that when making a reference copy of an array the maximum field is set to length, so that a and b always get their own copy when appending. I can't think of any other problems, but Walter would certainly know what could go wrong.
Jun 17 2002
Check out OutBuffer in the Phobos library, it is tuned for incrementally building an array. "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0E80EC.9090708 users.sourceforge.net...anderson wrote:BlockThat reminds me of what we used to do in C to speed up malloc/realloc.thenallocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) andit'd only need to update when it gets passed that number again.Python uses a specific function for overallocation that they claim gives linear reallocation speed on poorly performing reallocs, such as, uh, Windows'. I stuffed that in my realloc wrapper function so now I just reallocate everything up by one, secure in the knowledge that it'll be fast. The function is: static int __roundupsize (int n) { unsigned int nbits = 0; unsigned int n2 = (unsigned int) n >> 5; do { n2 >>= 3; nbits += 3; } while (n2); return ((n >> nbits) + 1) << nbits; } Python's source goes into its behaviour and results and I can dig that up if it's wanted. Arrays could be given a third integer for maximum that's set to length in slices and static arrays but is overallocated otherwise. Once it tops it, allocate the new array and copy it over. Resizing to lower lengths causes maximum to equal length, as it's essentially a slice operator. One real problem that comes up is in multiple array references: a = foo; /* foo is a dynamic array */ b = foo; a ~= 4; b ~= 8; a [a.length - 1] == 8 or == 4 depending upon whether (maximum != length) before the append. One solution would be that when making a reference copy of an array the maximum field is set to length, so that a and b always get their own copy when appending. I can't think of any other problems, but Walter would certainly know what could go wrong.
Jun 17 2002
This is the reason realloc is not encouraged in C++. With value semantics something can just be copied and used. C++ lets you override that, but ideally everything involved would inherently know how to do that safely or could prohibit copying. Things that are being pointed to (with pointers) cannot be moved without updating all the pointers. And pointers by definition go one direction. So if you want to use a pointer to point at something, use the heap, otherwise make an array object and use the indices as pointers. If that gets moved or copied, the pointer will still work. It allows range errors to creep in though and that's where the concept of iterator comes in (an iterator is like a "safe" pointer; it knows the managed area and can tell if it's within the valid range or not). And if your class is overly sensitive to being moved (allows pointers to itself to be made and doesn't watch them) your class should come from the heap and be known by reference. typedef uint intcontaineriterator; int intcontainer[cast(intcontaineriterator)100]; //typedef typeof(intcontainer.containedtype) intcontaineriterator; intcontaineriterator begin = cast(intcontaineriterator)0; intcontaineriterator end = cast(intcontaineriterator)intcontainer.length; for (intcontaineriterator i = begin; i != end; ++i) printf("%d,"intcontainer[i]); Value objects (int, struct) should go on the stack Reference objects (class) should go from a heap (somewhere) but who decides where they come from? The class itself doesn't know because derived classes might need to come from somewhere else. It's inconvenient for the user of the class to know but that's how it's mostly handled now. Perhaps you could always make objects from the main heap but alternatively could replace said allocation with one of your own and a matching delete. Which also at the same time prevents the builtin garbage collector from working on it and prevents values of that type from being constructed on the stack (turns it into a reference object) There must be some way to prove at compile time that each and every object ever allocated must be at some point destroyed, that the flow path always leads to a destructor or deallocator call. Especially if it were allowed to insert arbitrary calls to clean house unless otherwise instructed. Think of this as "don't worry about this... I'm going to take care of this garbage" will then allow the address-of operator to be used and allow the value to be passed by reference. In fact taking the address of or passing by reference both implicitly convert a value type into a reference type. If this ever happens in a scope, the value is no longer an auto. However the more explicit we make this the better so that leaks are avoided. But not too explicit since we don't want to make normal heap class allocation involve too much typing. Maybe this whole heap vs. stack question could be settled by having user-defined allocation operators, and you can choose for a class which allocator to use. For builtins and structs it defaults to the stack allocator (calloc). For class objects it defaults to the heap allocator (gc / malloc). You could override for a class to make them come from some other memory. Or to be accessed via a "forwarding" interface of some kind (if its data is not accessible from outside, the only way to communicate is via methods. A object not accessible by the main cpu couldn't have public data members? But that's up to the user.) Realloc is great for performance but it's just unsafe when the objects have pointers (possibly to each other or possibly held from outside). Has anyone ever thought of building a stack that grows into the heap? Surely someone has thought of that. void growstack(uint size) { if (stack.room < size) { malloc some more memory for the stack. 1.5x current total size Change stack pointer to top of new memory push oldstackpointer on new stack and keep track of how to get back to the old stack } else stackpointer -= size; return stackpointer; } This would assume stack cleanups always come in the reverse order of allocations. setjmp/longjmp could screw this up. But it makes the stack infinitely growable up to available memory (fixed size stacks suck) This kind of logic could be inserted for each stack frame where recursion is possible (otherwise it should be mostly determinable at link time how much stack memory is needed by an application) Sean "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0E80EC.9090708 users.sourceforge.net...anderson wrote:BlockThat reminds me of what we used to do in C to speed up malloc/realloc.thenallocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) andit'd only need to update when it gets passed that number again.Python uses a specific function for overallocation that they claim gives linear reallocation speed on poorly performing reallocs, such as, uh, Windows'. I stuffed that in my realloc wrapper function so now I just reallocate everything up by one, secure in the knowledge that it'll be fast. The function is: static int __roundupsize (int n) { unsigned int nbits = 0; unsigned int n2 = (unsigned int) n >> 5; do { n2 >>= 3; nbits += 3; } while (n2); return ((n >> nbits) + 1) << nbits; } Python's source goes into its behaviour and results and I can dig that up if it's wanted. Arrays could be given a third integer for maximum that's set to length in slices and static arrays but is overallocated otherwise. Once it tops it, allocate the new array and copy it over. Resizing to lower lengths causes maximum to equal length, as it's essentially a slice operator. One real problem that comes up is in multiple array references: a = foo; /* foo is a dynamic array */ b = foo; a ~= 4; b ~= 8; a [a.length - 1] == 8 or == 4 depending upon whether (maximum != length) before the append. One solution would be that when making a reference copy of an array the maximum field is set to length, so that a and b always get their own copy when appending. I can't think of any other problems, but Walter would certainly know what could go wrong.
Jun 18 2002
"anderson" <anderson firestar.com.au> wrote in message news:ael937$2qm$1 digitaldaemon.com...That reminds me of what we used to do in C to speed up malloc/realloc.Blockallocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) andthenit'd only need to update when it gets passed that number again. Even C++'s vector did that.That was the original plan, but due to the way array slicing works, there's no way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result is terrible performance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.
Jun 17 2002
Thanks, I didn't think you'd miss that. "Walter" <walter digitalmars.com> wrote in message news:aem052$p8b$2 digitaldaemon.com...That was the original plan, but due to the way array slicing works,there'sno way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result isterribleperformance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.
Jun 17 2002
Just a question/thought ... for (i = 0; i < n; i++) if (...) A1[A1.length++] = foo(); converted to the complier language equilent to into ... for (i = 0; i < n; i++) { if (...) if (A1.length == ++CurrentLength ) A1.length = A1.length + 10; //Or A1.length = A1.length + A1.length >> 1 A1[] = foo(); } } TrimArray(A1); ...when ever it finds a .length++ inside that loop. The nesting levels and amount the complier has to traverse would be a problem. Although it wouldn't have to traverse function with "in arrays" because the length shouldn't beable to be changed on these. Of coarse that would still run slower then doing it outside the loop. In somecases it's impossible to predict if the array will be resized inside the loop or not, and so code like that needs to be written anyway. But as you said, there's an "OutBuffer" that simplifies that? Although I know theres probably a perfectly good reason not to use this.
Jun 17 2002
"Walter" <walter digitalmars.com> ha scritto nel messaggio news:aem052$p8b$2 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:ael937$2qm$1 digitaldaemon.com...there'sThat reminds me of what we used to do in C to speed up malloc/realloc.Blockallocation is the key. Parhaps .length++ could increase by n (ie 10) values or n% (ie 2%) andthenit'd only need to update when it gets passed that number again. Even C++'s vector did that.That was the original plan, but due to the way array slicing works,no way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result isterribleperformance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.So it is a thing to underline very well in the spec: "reallocation of a vector through the length property may be a CPU hog. Instead of writing: for (i = 0; i < n; i++) { array.length = array.length + 1; array[i] = foo(); } Write: array.length = array.length + n; for (i = 0; i < n; i++) { array[i] = foo(); } This way you reduce from exponential complexity to linear." Obviously this should be written in correct English :-) Ciao
Jun 17 2002
You're right. I obviously need to make this point clear in the spec.
Jun 18 2002
*sigh* But of coarse I was discussing the exceptions to this rule. ie when you are collecting or grouping data from an array and you have no idea what size the array needs to be expanded to. If you increased it by n every time it could be in-efficient if n = 10000 and the resize only needed to be 10. Also versa versa. Sometimes things like this can be solved in two array passes, but when the results directly related to the movement of data in the arrays this it is impossible to use that method.
Jun 18 2002
"anderson" <anderson firestar.com.au> wrote in message news:aened5$27vo$1 digitaldaemon.com...*sigh* But of coarse I was discussing the exceptions to this rule. ie when youarecollecting or grouping data from an array and you have no idea what sizethearray needs to be expanded to. If you increased it by n every time itcouldbe in-efficient if n = 10000 and the resize only needed to be 10. Alsoversaversa. Sometimes things like this can be solved in two array passes, but when the results directly related to the movement of data in the arrays this it is impossible to use that method.So use any other algorithm of your choice. I often double the array when exhausted, it's fast and easy. Ciao
Jun 19 2002
On Mon, 17 Jun 2002 17:56:36 -0700 "Walter" <walter digitalmars.com> wrote:That was the original plan, but due to the way array slicing works, there's no way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result is terrible performance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.Does this mean that ~= also performs a reallocation each time? It would be inacceptible...
Jun 18 2002
Pavel Minayev wrote:On Mon, 17 Jun 2002 17:56:36 -0700 "Walter" <walter digitalmars.com> wrote:Yes, ~= is functionally identical to incrementing the length yourself. I'm working on a journal article detailing internal behaviour of dynamic arrays. It's either this way, making slice operations an active copy, or a maximum field.That was the original plan, but due to the way array slicing works, there's no way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result is terrible performance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.Does this mean that ~= also performs a reallocation each time? It would be inacceptible...
Jun 18 2002
Those are our 3 choices? I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytes of storage. Well ram is cheap, and getting cheaper. ;) Sean "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0EF52D.90600 users.sourceforge.net...Pavel Minayev wrote:wrote:On Mon, 17 Jun 2002 17:56:36 -0700 "Walter" <walter digitalmars.com>there'sThat was the original plan, but due to the way array slicing works,terribleno way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result isYes, ~= is functionally identical to incrementing the length yourself. I'm working on a journal article detailing internal behaviour of dynamic arrays. It's either this way, making slice operations an active copy, or a maximum field.performance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.Does this mean that ~= also performs a reallocation each time? It would be inacceptible...
Jun 18 2002
Agreed. "give it the capacity field" gets my vote "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aen31a$1shu$1 digitaldaemon.com...Those are our 3 choices? I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytesofstorage. Well ram is cheap, and getting cheaper. ;) Sean "Burton Radons" <loth users.sourceforge.net> wrote in message news:3D0EF52D.90600 users.sourceforge.net...thePavel Minayev wrote:wrote:On Mon, 17 Jun 2002 17:56:36 -0700 "Walter" <walter digitalmars.com>there'sThat was the original plan, but due to the way array slicing works,no way for the GC to tell that there's "unused" space off the end ofuseterriblearray. Hence, it must reallocate and copy every time. The result isperformance - the cure is to preallocate the length you'll need, orYes, ~= is functionally identical to incrementing the length yourself. I'm working on a journal article detailing internal behaviour of dynamic arrays. It's either this way, making slice operations an active copy, or a maximum field.OutBuffer which will do block reallocation in suitable increments.Does this mean that ~= also performs a reallocation each time? It would be inacceptible...
Jun 18 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aen31a$1shu$1 digitaldaemon.com...Those are our 3 choices? I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytesofstorage. Well ram is cheap, and getting cheaper. ;) SeanOf cause you can always pack that value into a byte, with values like n=>n^2, 1=>1, 2=>2, 3=>4, 4=>8 (where n is the value of the byte). Also you could pack in the byte in with the 32-length value as the MSB, because 24bit, 256x256x256 = 16777216 is plenty for an array these days (but I could be wrong).
Jun 18 2002
All sounds a bit inefficient from a performance point of view. :/ "anderson" <anderson firestar.com.au> wrote in message news:aeonrf$i7a$1 digitaldaemon.com..."Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aen31a$1shu$1 digitaldaemon.com...youThose are our 3 choices? I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytesofstorage. Well ram is cheap, and getting cheaper. ;) SeanOf cause you can always pack that value into a byte, with values like n=>n^2, 1=>1, 2=>2, 3=>4, 4=>8 (where n is the value of the byte). Alsocould pack in the byte in with the 32-length value as the MSB, because 24bit, 256x256x256 = 16777216 is plenty for an array these days (but Icouldbe wrong).
Jun 18 2002
"Matthew Wilson" <matthew thedjournal.com> wrote in message news:aeorj3$lh8$1 digitaldaemon.com...All sounds a bit inefficient from a performance point of view. :/I'd aggree to that, but as a programmer I always like to look at alternative. Probably a small one, these often a toss up with effeciency and memory. Note I was able to do the afore mentioned in C with a few or's, a shift and a plus, but that my be optimised with todays proccessors. I'd probably for the extra 32-bits because, it'll make little diffence when compared to the magitude of arrays and also compared to the amount of memory your already wasting to make things more effecient anyway. For example max of 10 32-bits with only 8 used, what's an extra 32-bits, nothing. And the aim is performace anyway.
Jun 18 2002
"Matthew Wilson" <matthew thedjournal.com> wrote in message news:aeorj3$lh8$1 digitaldaemon.com...All sounds a bit inefficient from a performance point of view. :/I'd aggree to that, but as a programmer I always like to look at alternative. A small performance hit. Often there is a toss up with effeciency and memory. Note I was able to do the afore mentioned in C with a few or's, a shift and a plus, but that my be optimised with todays proccessors. One performace gain is that it would mean less memory to proccess in the CPU. Often it's faster to uncompress something in th CPU/RAM then to load twice the size from RAM/hardrive, but that's another story. I'd probably go for the extra 32-bits because, it'll make little diffence when compared to the magitude of arrays and also compared to the amount of memory your already wasting to make things more effecient anyway. For example max of 10 32-bits with only 8 used, what's an extra 32-bits, nothing. And the aim is performace anyway.
Jun 18 2002
"Matthew Wilson" <matthew thedjournal.com> wrote in message news:aeorj3$lh8$1 digitaldaemon.com...All sounds a bit inefficient from a performance point of view. :/I'd aggree to that, but as a programmer I always like to look at alternative. A small performance hit. Often there is a toss up with effeciency and memory. Note I was able to do the afore mentioned in C with a few or's, a shift and a plus, but that my be optimised with todays proccessors. One performace gain is that it would mean less memory to proccess in the CPU. Often it's faster to uncompress something in th CPU/RAM then to load twice the size from RAM/hardrive, but that's another story. I'd probably go for the extra 32-bits because, it'll make little diffence when compared to the magitude of arrays and also compared to the amount of memory your already wasting to make things more effecient anyway. For example max of 10 32-bits with only 8 used, what's an extra 32-bits, nothing. And the aim is performace anyway.
Jun 18 2002
Sean L. Palmer wrote:Those are our 3 choices?As far as I know. Array slices that copy aren't a real option, as: b [0 .. n] = c; Will no longer work as expected... it'll make a slice of the array and then clear it to a single value, so it fails many assumptions of the standard. But it would allow realloc to be used. Uh, the high bit of length could be used to indicate that the array is a static, a slice, or an assignment. When resizing to a larger size, it's reallocated if the bit is set or if the length will cross a roundup boundary. That's a fourth choice. anderson described a fifth (and you'd only need five bits to do up to four gig length, so arrays of up to 134217728 length could be represented). I personally think exponential reallocation wastes too much space - on average it'll make the array 50% too large - and this only works with one overallocation method.I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytes of storage. Well ram is cheap, and getting cheaper. ;)It'll be much cheaper for equivalent code as there'll be fewer temporary copies running around dancing in tights. printf ("%.*s", (char []) "foo"); won't work any more, so it shouldn't be done, if ever, until fmt is in and working, then printf should probably be removed from Phobos until all code can be fixed up. Here's the roundup function I posted earlier with comments: /* Round up: * If n < 8, to a multiple of 1. (My addition) * If n < 256, to a multiple of 8. * If n < 2048, to a multiple of 64. * If n < 16384, to a multiple of 512. * If n < 131072, to a multiple of 4096. * If n < 1048576, to a multiple of 32768. * If n < 8388608, to a multiple of 262144. * If n < 67108864, to a multiple of 2097152. * If n < 536870912, to a multiple of 16777216. * ... * If n < 2**(5+3*i), to a multiple of 2**(3*i). * * This over-allocates proportional to the list size, making room * for additional growth. The over-allocation is mild, but is * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc() (which is a reality, e.g., across all flavors * of Windows, with Win9x behavior being particularly bad -- and * we've still got address space fragmentation problems on Win9x * even with this scheme, although it requires much longer lists to * provoke them than it used to). * (From Python (http://www.python.org) source code) */ int roundupsize(int n) { if (n < 8) return n; uint nbits = 0; uint n2 = (uint) n >> 5; do { n2 >>= 3; nbits += 3; } while (n2); return ((n >> nbits) + 1) << nbits; }
Jun 18 2002
"Burton Radons" <loth users.sourceforge.net> wrote in message news:3D100B21.1040604 users.sourceforge.net...Sean L. Palmer wrote:Those are our 3 choices?anderson described a fifth (and you'd only need five bits to do up to four gig length, so arrays of up to 134217728 length could be represented). I personally think exponential reallocation wastes too much space - on average it'll make the array 50% too large - and this only works with one overallocation method.I also think 50% is to large. It just needs to be tweeked utill a good set values fall out. The extra value (offset) only needs to contain where the cutoff point is so it can simply be added like so. If the value is exceeded, then it's simply rapped around (offset -1). I don't think this is coming out very clear. Or parhaps it is? Alternativly, you can get way with no max_number at all. Simply look at the length number and decide from that if it needs to increased. If it's linear this can be extreamly easy. Persudo length++; //The actual array size is Actualsize = length + length mod Increment; //So that if (actualsize changes) if ((length mod Increment) == 0) realloc Actualsize But divides can be expensive.... but there are plenty of ways around divides.
Jun 18 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aen31a$1shu$1 digitaldaemon.com...I'll take the maximum field. Useful for doing a sort of "reserve" operation. After that, ~= and array.length++ aren't nearly so much of a problem. The only problem is that dynamic arrays then need 4 more bytesofstorage. Well ram is cheap, and getting cheaper. ;)There is actually a way to cheat and retrieve some of the performance by working with the way the gc allocates storage. This will have to wait a bit, though, until I can spend more time with the GC.
Jul 07 2002
"Pavel Minayev" <evilone omen.ru> wrote in message news:CFN374255097967477 news.digitalmars.com...On Mon, 17 Jun 2002 17:56:36 -0700 "Walter" <walter digitalmars.com>wrote:there'sThat was the original plan, but due to the way array slicing works,terribleno way for the GC to tell that there's "unused" space off the end of the array. Hence, it must reallocate and copy every time. The result isYes, it does mean that, unfortunately.performance - the cure is to preallocate the length you'll need, or use OutBuffer which will do block reallocation in suitable increments.Does this mean that ~= also performs a reallocation each time? It would be inacceptible...
Jul 07 2002
And couldn't the compiler warn - which warning to be filtered out by compiler-plug-in - in such an instance? "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:ael7ve$163$1 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...sameBesides, can't the array.length++ be optimised slightly in the complier because it doesn't have to do lower bound checks? Although I suppose the complier could probably detect array.length = array.length + 1 as thecompilerthing. Keeping properties the same as variables would make life easier for beginners who tradionaly don't care about performace until they evolveintoa "Complier Walter" -> advanced programmer. Parhaps there's another way to solve that bad coding problem ?????Yeah... speed up array reallocation. ;) That's what Walter's afraid of I guess. I just don't see the potential misuse of a otherwise useful feature as grounds for not including it in the language. Most people wouldn't care. They'd write it, it'd be slow, and they'd not care or in fact even notice. Only us speed freaks care, and we would never write slop such as that because part of caring about performance is understanding what theis transforming your code into. Most "normal" programmers would think it runs "fast enough". ;) Sean
Jun 17 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:ael7ve$163$1 digitaldaemon.com...I just don't see the potential misuse of a otherwise useful feature as grounds for not including it in the language. Most people wouldn't care. They'd write it, it'd be slow, and they'd not care or in fact even notice.The performance penalty of such a loop can easilly reduce a 2GHz machine to behave worse than a 4.77MHz PC! I've seen it. The problem is it isn't incrementally worse, it's exponentially worse, and a powerful exponential at that.Only us speed freaks care, and we would never write slop such as that because part of caring about performance is understanding what thecompileris transforming your code into.Unfortunately, people do routinely write such code.
Jun 17 2002
"anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...I don't agree. Any decent programmer with half a brain would beable to notice that one.I see that kind of code all the time, over and over. I saw it again recently in a popular benchmark program. I've shown many people how they can improve performance a thousand+ fold by preallocating the array. I believe that by supporting ++ on the .length, that would implicitly bless that wrong technique.Besides, what's going to stop them from doing ... for (i = 0; i < n; i++) { array.length = array.length + 1; array[n] = foo(); } or for (i = 0; i < n; i++) { array.length = n + 1; array[n] = foo(); }Absolutely nothing will prevent them from writing the loop that way.
Jun 17 2002
Agree. If they want to do it badly, let them do it longhand "Walter" <walter digitalmars.com> wrote in message news:aelvi3$onf$1 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...recentlyI don't agree. Any decent programmer with half a brain would beable to notice that one.I see that kind of code all the time, over and over. I saw it againin a popular benchmark program. I've shown many people how they canimproveperformance a thousand+ fold by preallocating the array. I believe that by supporting ++ on the .length, that would implicitlyblessthat wrong technique.Besides, what's going to stop them from doing ... for (i = 0; i < n; i++) { array.length = array.length + 1; array[n] = foo(); } or for (i = 0; i < n; i++) { array.length = n + 1; array[n] = foo(); }Absolutely nothing will prevent them from writing the loop that way.
Jun 17 2002
You can't predict exactly how much memory you need alot of the time. But you can give a rough estimate and the compiler can try its best to help if you're being a moron and allocating hundreds of things one-by-one. I'd rather the language be kinda smart about guesstimating the array reallocation anyway because sometimes you just can't know how often something will be used and don't have access to rewrite the algorithm that calls your allocation function. If you write a library that makes foo's, someone will write a loop foo*a []; for (int i=0; i<1000; i++) a[a.length++] = new foo; There are just those kinds of people in the world (they're called newbies, and they grow out of it eventually) I don't want to reduce language functionality (or have a special case for length) just because somebody might misuse it. Just make array preallocation smarter. Add more info so that the GC has enough info to know how to do it properly if you must. Behind-the-scenes baggage is ok so long as it makes your job as a programmer easier. We all like code that works and runs fast. Walter you have absolutely the worst job ever, which is the job of making everybody else's jobs easier. Maybe by sometimes telling them to give it up and don't use ++ on array.length property. ;) Sean "Walter" <walter digitalmars.com> wrote in message news:aelvi3$onf$1 digitaldaemon.com..."anderson" <anderson firestar.com.au> wrote in message news:aeks0b$24p8$1 digitaldaemon.com...recentlyI don't agree. Any decent programmer with half a brain would beable to notice that one.I see that kind of code all the time, over and over. I saw it againin a popular benchmark program. I've shown many people how they canimproveperformance a thousand+ fold by preallocating the array. I believe that by supporting ++ on the .length, that would implicitlyblessthat wrong technique.Besides, what's going to stop them from doing ... for (i = 0; i < n; i++) { array.length = array.length + 1; array[n] = foo(); } or for (i = 0; i < n; i++) { array.length = n + 1; array[n] = foo(); }Absolutely nothing will prevent them from writing the loop that way.
Jun 18 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aempe3$1iur$1 digitaldaemon.com...Walter you have absolutely the worst job ever, which is the job of making everybody else's jobs easier. Maybe by sometimes telling them to give itupand don't use ++ on array.length property. ;)Oh, I wouldn't call it "worst". The worst is being on the other table, where I've been so many times, telling the powers-that-be that language X needs to be fixed thusly, and they tell me to "give it up" <g>. Hence, the genesis of D.
Jul 08 2002
On Mon=2C 17 Jun 2002 17=3A43=3A25 -0700 =22Walter=22 =3Cwalter=40digitalmars=2Ecom=3E wrote=3A =3E I see that kind of code all the time=2C over and over=2E I saw it again recently =3E in a popular benchmark program=2E I've shown many people how they can improve =3E performance a thousand+ fold by preallocating the array=2E =3E =3E I believe that by supporting ++ on the =2Elength=2C that would implicitly bless =3E that wrong technique=2E But still=2E=2E=2E you do support operator ~=3D =28add element to the end of the array=29=2C don't you=3F ++ is essentially the same=2C it adds the element and initializes it with default value for its type=2C so what's the difference=3F We're talking of dynamic arrays=2C after all=2C I understand that preallocation is a useful technique=2C but it is not always useable=2E Since ~=3D is there=2C ++ should also be just for consistency! =3D=29 Also=2C I wonder why there is no -- =3F It would be used even wider=2C since it is practically a stack-pop operator=2E=2E=2E =09
Jun 18 2002
That's a very interesting point! All this time, array[array.length++] = Value; Could have been done more simply like array ~= Value; I forgot about the ~ character Parhaps Walter should change the documentation " The D Way D supports dynamic arrays, which can be easilly resized. D supports all the requisite memory management. int array[]; array[array.length++] = x; " to " The D Way D supports dynamic arrays, which can be easilly resized. D supports all the requisite memory management. int array[]; array ~= x; " "Pavel Minayev" <evilone omen.ru> wrote in message news:CFN374255085725347 news.digitalmars.com... On Mon, 17 Jun 2002 17:43:25 -0700 "Walter" <walter digitalmars.com> wrote:I see that kind of code all the time, over and over. I saw it againrecentlyin a popular benchmark program. I've shown many people how they canimproveperformance a thousand+ fold by preallocating the array. I believe that by supporting ++ on the .length, that would implicitlyblessthat wrong technique.But still... you do support operator ~= (add element to the end of the array), don't you? ++ is essentially the same, it adds the element and initializes it with default value for its type, so what's the difference? We're talking of dynamic arrays, after all, I understand that preallocation is a useful technique, but it is not always useable. Since ~= is there, ++ should also be just for consistency! =) Also, I wonder why there is no -- ? It would be used even wider, since it is practically a stack-pop operator...
Jun 18 2002
Seems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could be accomodated efficiently. Any reasons against? "Pavel Minayev" <evilone omen.ru> wrote in message news:CFN374255085725347 news.digitalmars.com... On Mon, 17 Jun 2002 17:43:25 -0700 "Walter" <walter digitalmars.com> wrote:I see that kind of code all the time, over and over. I saw it againrecentlyin a popular benchmark program. I've shown many people how they canimproveperformance a thousand+ fold by preallocating the array. I believe that by supporting ++ on the .length, that would implicitlyblessthat wrong technique.But still... you do support operator ~= (add element to the end of the array), don't you? ++ is essentially the same, it adds the element and initializes it with default value for its type, so what's the difference? We're talking of dynamic arrays, after all, I understand that preallocation is a useful technique, but it is not always useable. Since ~= is there, ++ should also be just for consistency! =) Also, I wonder why there is no -- ? It would be used even wider, since it is practically a stack-pop operator...
Jun 18 2002
On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson" <matthew thedjournal.com> wrote:Seems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could be accomodated efficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jun 19 2002
There are always reasons against, but probably none worth the advantages this would bring. Disadvantages 1) Additional overhead (speed/ram) - Code that enlarges memory outside the loop will also have to have a check for capacity and possibly resize to a larger then needed array. In these cases the slightly extra time needed would be barley noticeable. Although probably not worth the effort, if capacity uses an entire 32-bits (or 16-bit offset) representation (ie not exponentially based) then perhaps the complier could treat. //any array.length = array.length = array.length + 10 as it currently does and make array.capacity = array.length //and any of these things increase capacity offsets by a factor ++ += -= -- Also it'd be nice to have access to .capacity (read and write). If capacity < length, then length would be trimmed. 2) Extra work for Walter. PS - Has anyone thought of having a bit flag with arrays. Yes I know this is extra storage, perhaps it could be combine into the capacities 16-bit offset to make a 32-bits pack (16-bit capacity offset and 16-bits of array flag). The flags could be used for dirty bits and things like reversing arrays (but that would have problems with length changes). Of course this type of stuff could be done by the programmer, and it's just a dumb though I had. "Pavel Minayev" <evilone omen.ru> wrote in message news:CFN37426561534456 news.digitalmars.com...On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson"<matthew thedjournal.com>wrote:accomodatedSeems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could beefficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jun 19 2002
Pavel Minayev <evilone omen.ru> wrote in news:CFN37426561534456 news.digitalmars.com:On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson" <matthew thedjournal.com> wrote:I agree. Another idea might be to store the capacity as part of the memory block header and leave the array as is. [-1] = n [0] <- array(ptr,length) [1] [2] [3] [...] [length] [...] [n] Unfortunately this doesn't work for slices. Perhaps the high order bit of length could be used as a flag to indicate an array is a slice.Seems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could be accomodated efficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jun 20 2002
I would do the "proxy" approach to slices. Make slices a distinct type that has extra information, and *knows* it's a slice of another array. If used in a situation where the length can change, it copies itself into a new distinct array and is no longer a slice. If you don't change the length it's very fast. So arrays and array slice proxies have the same signature up to a point and yes perhaps the length field is the best place to store it since inability to change length or "copy if length changed" is the main difference between a slice and a regular array. Sean "Patrick Down" <pat codemoon.com> wrote in message news:Xns92335878DD4B0patcodemooncom 63.105.9.61...Pavel Minayev <evilone omen.ru> wrote in news:CFN37426561534456 news.digitalmars.com:On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson" <matthew thedjournal.com> wrote:I agree. Another idea might be to store the capacity as part of the memory block header and leave the array as is. [-1] = n [0] <- array(ptr,length) [1] [2] [3] [...] [length] [...] [n] Unfortunately this doesn't work for slices. Perhaps the high order bit of length could be used as a flag to indicate an array is a slice.Seems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could be accomodated efficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jun 20 2002
Yes! "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aet11q$1veg$1 digitaldaemon.com...I would do the "proxy" approach to slices. Make slices a distinct typethathas extra information, and *knows* it's a slice of another array. If used in a situation where the length can change, it copies itself into a new distinct array and is no longer a slice. If you don't change the length it's very fast. So arrays and array slice proxies have the same signature up to a pointandyes perhaps the length field is the best place to store it since inability to change length or "copy if length changed" is the main differencebetweena slice and a regular array. Sean "Patrick Down" <pat codemoon.com> wrote in message news:Xns92335878DD4B0patcodemooncom 63.105.9.61...Pavel Minayev <evilone omen.ru> wrote in news:CFN37426561534456 news.digitalmars.com:On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson" <matthew thedjournal.com> wrote:I agree. Another idea might be to store the capacity as part of the memory block header and leave the array as is. [-1] = n [0] <- array(ptr,length) [1] [2] [3] [...] [length] [...] [n] Unfortunately this doesn't work for slices. Perhaps the high order bit of length could be used as a flag to indicate an array is a slice.Seems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could be accomodated efficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jun 20 2002
A slice should simply be a constant array as with array sent to a function with the "in" but not the "inout" argument. "Sean L. Palmer" <seanpalmer earthlink.net> wrote in message news:aet11q$1veg$1 digitaldaemon.com...I would do the "proxy" approach to slices. Make slices a distinct typethathas extra information, and *knows* it's a slice of another array. If used in a situation where the length can change, it copies itself into a new distinct array and is no longer a slice. If you don't change the length it's very fast. So arrays and array slice proxies have the same signature up to a pointandyes perhaps the length field is the best place to store it since inability to change length or "copy if length changed" is the main differencebetweena slice and a regular array. Sean
Jun 20 2002
"anderson" <anderson firestar.com.au> wrote in message news:aetvdn$a02$1 digitaldaemon.com...A slice should simply be a constant array as with array sent to a function with the "in" but not the "inout" argument.In other words I ment that the address of a contants array cannot be changed and therefore the array cannot be resized. But the array values can be changed.
Jul 08 2002
"Sean L. Palmer" <seanpalmer earthlink.net> wrote in news:aet11q$1veg$1 digitaldaemon.com:I would do the "proxy" approach to slices. Make slices a distinct type that has extra information, and *knows* it's a slice of another array. If used in a situation where the length can change, it copies itself into a new distinct array and is no longer a slice. If you don't change the length it's very fast. So arrays and array slice proxies have the same signature up to a point and yes perhaps the length field is the best place to store it since inability to change length or "copy if length changed" is the main difference between a slice and a regular array.I agree. The same thought has occured to be about slices being a distinct type. However I couldn't quite figure out a syntax for it. Maybe something like... int[10] a; // regular array; int[..] b = a[2..4]; // slice
Jun 20 2002
"Pavel Minayev" <evilone omen.ru> wrote in message news:CFN37426561534456 news.digitalmars.com...On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson"<matthew thedjournal.com>wrote:accomodatedSeems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could beDynamic arrays currently are represented by a register pair. Adding another register would put a lot of register pressure on the code generator, and I think it would seriously slow down code that deals a lot with arrays. -Walterefficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jul 09 2002
Walter wrote:"Pavel Minayev" <evilone omen.ru> wrote in message news:CFN37426561534456 news.digitalmars.com...Depending upon the kind of code, of course. Any complex array-manipulating code, particularly text, simply must depend heavily on ~, so this is going to be faster regardless. The 32nd bit option looks most promising though, to indicate that this array is from the start of a GC block and is owned by this instance. The big problem, of course, is that the GC isn't fitted for doing this and requires searching through the pools before being able to add up all the owned pages, if I interpret the code correctly. I don't really see it being of much help here; what it can do is stuff its allocated length value in the first four bytes of any array allocation through new, so that the array resize can just pump up the length silently if it fits. The GC can also do proportional overallocation here so that really long arrays don't go crappy. Then the code generator needs to be aware that array assignments and passing as arguments leads to a bit getting taken off, and reading the length field needs to mask off the bit, and the parts of Phobos that take apart the array needs to be fixed to mask it off. The machine code string compare is broken right now, actually, in a subtle way that I can't reproduce easily. Just thought of something: printf will still be usable if the 32nd bit is used to indicate ownership, since it'll be masked off when passed as an argument. So it doesn't even affect that; good stuff. The array part of the specification should have a section on what you can and cannot expect from a compliant implementation, keeping in mind the current method, maximum length, the 32nd bit, and any other legal contortion. Things like: - Appending to an array may or may not result in it being re-allocated. char [] a = "foo", b; a ~= "b"; b = a; a ~= "ar"; a [0] = "x"; /* b [0] may be either "x" or "f". */ - The array from a slice operator will always be re-allocated if appended to. char [] a = "foo", b; b = a [0 .. 1]; b ~= "x"; /* a [1] is "o", b [1] is "x" */ - Assignments, passing an array as an argument, and static array initialisation act identical to a slice operation of the whole array. char [] a = "foo", b; b = a; b ~= "bar"; a [0] = "x"; /* a is "fxo", b is "foobar". */ This would be very useful for compiler writers to give us an idea of acceptable behaviour. I see your struggling with templates more as a specification deficiency than a problem with the concept - the spec should have been clear very early on what it would require of the compiler. Every language I've written a compiler for has been deficient in this respect, resulting in a lot of later code manipulation to get it to do something I was never expecting. A great big "Compiling D" page of the specification would be much appreciated.On Wed, 19 Jun 2002 09:02:43 +1000 "Matthew Wilson"<matthew thedjournal.com>wrote:accomodatedSeems like if we give the arrays a notion of capacity, all these sophistications (including the previously unliked ++) could beDynamic arrays currently are represented by a register pair. Adding another register would put a lot of register pressure on the code generator, and I think it would seriously slow down code that deals a lot with arrays. -Walterefficiently. Any reasons against?None! An additional int field to store the "actual" size of the array is worth it. STL uses such approach, after all, and it proved its efficiency already, why not use it in D as well? Walter?
Jul 09 2002
"Burton Radons" <loth users.sourceforge.net> wrote in message news:3D2A9D45.8010804 users.sourceforge.net...This would be very useful for compiler writers to give us an idea of acceptable behaviour. I see your struggling with templates more as a specification deficiency than a problem with the concept - the spec should have been clear very early on what it would require of the compiler. Every language I've written a compiler for has been deficient in this respect, resulting in a lot of later code manipulation to get it to do something I was never expecting. A great big "Compiling D" page of the specification would be much appreciated.You're right. I've been intending to add "implementation notes" sprinkled in the spec that won't form part of the spec, but will be useful to implementors.
Jul 09 2002
Joel Don't worry too much about grammar - that's the job of editors. We would like your code to be tested, ideally you should include a test program (though probably that is overkill for notes), although it is the job of tech-editors to verify submitted code. Am starting a list, but once we get sorted next week with a projected structure and send out a call for papers I'll just expect people to email them to submissions thedjournal.com "anderson" <anderson firestar.com.au> wrote in message news:aecr4v$2td1$1 digitaldaemon.com... Ok, I've made a few changes. Perhaps some of the things I added should be tips. It's in html now, but I've discovered that my html editors have stopped working (xp -upgrade), so I simply used word (yuk). It shouldn't be a problem to convert it to standard html/xhtml later though. I don't mind the constructive criterions. I fact I'm suprised any of them got though at all (note to self - better double check that dogy code and gramma). I didn't spend to much time writing them. I hoped it would just spark others off. On another note, parhaps someone should start a hints and tips (or tips and tricks) list. Just to get a big collection of them which you (or someelse) can sort though for the first issue. Over PS I was just reading though this neat webpage - interesting about programming personality, some of it is opinion based, but it's still good. http://homepage.mac.com/kevinmarks/personality.html
Jun 14 2002
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'll have a look. Note I didn't make it for a website, I just did that to keep things in = order. I though this was going to be phased by some CGI script or = somthing, but a localised part should be ok as well. I found the = previous bugs (not using H1) before your post, but wasn't going to send = until I had a bit more. If you want html l'll put in in html (or xtml) . = I'll look though those notes, thanks. "Matthew Wilson" <dmd synesis.com.au> wrote in message = news:aeclsn$2o24$1 digitaldaemon.com... OK, I've fixed the bugs up (included) My thoughts (editor hat comically hanging off the left brow, so I can = watch the South Korea - Portugal game with the right :): 1. Walking backwards in arrays - ok, useful for programming neophytes. Could do with explanation of which is preferred and why 2. Filler - not sure these = are terribly useful, unless each is contextualised. The optimisation one = is worth saying, however 3. D arrays can be sorted - need to comment on the sort = order 4. D arrays can be resized - perfect note 5. Comparing arrays - perfect note 6. D newsgroup - good note (although = links will be on the site) 7. HTML embedded code - good note 8. Notes - not necessary. = There'll be full info on how to write for us on the magazine site, but good to mention in this file for the moment 9. Which comes first - think this is way too = complex a topic to be summed up in a note. What about an article? 10. Cohesion / Coupling - reasonable 11. When to Optimise - should be a Tip. Could be = useful as such. You'd need to provide citations for your quotes/statements 12. KISS / KINAS - Again, statements without rationale. Need to back up these philosophical points 13. Localisation - [localisation is often = used as an interchangeable term with internationalisation]. What you are = talking about is locality-of-reference. Again would be better as a Tip = including references 14. goto - Needs some concrete = dangers of goto, and also at least one situation where they are = useful/necessary Keep em coming. We've got at least 7 out of that lot. In publishing = 50% is pretty good, let me tell you (as a battle-scarred weary word-warrior). :) "anderson" <anderson firestar.com.au> wrote in message news:aeckfv$2mms$1 digitaldaemon.com... > Any suggestions? > > >
Jun 14 2002
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable (sic) - That wasn't ment to send. "anderson" <anderson firestar.com.au> wrote in message = news:aecr91$2tid$1 digitaldaemon.com... I'll have a look. Note I didn't make it for a website, I just did that to keep things in = order. I though this was going to be phased by some CGI script or = somthing, but a localised part should be ok as well. I found the = previous bugs (not using H1) before your post, but wasn't going to send = until I had a bit more. If you want html l'll put in in html (or xtml) . = I'll look though those notes, thanks.
Jun 14 2002