The real drawback of Smalltalk's Array literal, #(), is that it only allows
the programmer to store very simple objects - for example, #(1 2 3), etc. If one does something like #(1@2 3@4) then this is converted to anArray, #(1 #@ 2 3 #@ 4) which is not what is wanted most times. What is wanted generally by the user is to convert the literal "properly" into a collection of, in this case, Points. I have attached a package consisting of 3 String methods one of which is the single user method - String>>asLiteral Instead of using an Array literal to input data, a String is used and the data is entered as per Array literal. This is parsed into it's component Smalltalk expressions and then each expression evaluated by native Dolphin base messages. The result is an OrderedCollection of correspondingly ordered objects. I trust that many people will find this simple method useful - I wonder that no one thought of it years ago. Any bugs and suggestions, please write me at [hidden email] Regards all, John Trinder begin 666 JT String method asLiteral.pac M?"!P86-K86=E('P-"G!A8VMA9V4@.CT@4&%C:V%G92!N86UE.B G2E0@4W1R M:6YG(&UE=&AO9"!A<TQI=&5R86PG+@T*<&%C:V%G92!P87A697)S:6]N.B P M.PT*"6)A<VEC0V]M;65N=#H@)S(W4V5P,#,-"@T*4&%C:V%G92!C;VYS:7-T M<R!O9B S(&UE=&AO9',@;VYL>2X-"@T*57-E<B!-971H;V1S.B @4W1R:6YG M/CYA<TQI=&5R86P-"@T*57-A9V4Z(" \85-T<FEN9SX@87-,:71E<F%L#0H) M=VAE<F4@85-T<FEN9R!C86X@8F4@82!S97)I97,@;V8@<')I;6ET:79E(%-M M86QL=&%L:R!E>'!R97-S:6]N<R!S97!E<F%T960@8GD-"@ES<&%C97,-"@T* M06YS=V5R.B!A;D]R9&5R961#;VQL96-T:6]N#0H)8V]N<VES=&EN9R!O9B!T M:&4@86)O=F4@97AP<F5S<VEO;G,@979A;'5A=&5D#0H-"E9A;&ED($5X<')E M<W-I;VYS.@T*"4UA>2!C;VYT86EN(&=L;V)A;"!V87)I86)L92!R969E<F5N M8V5S(&)U="!N;W0@;&]C86P@=F%R:6%B;&5S#0H)97AA;7!L97,Z#0H))R<Q M0#(@(#- -" @-4 V)R<@("T^(&%N3W)D97)E9$-O;&QE8W1I;VX@;V8@8V]R M<F5S<&]N9&EN9R!0;VEN="!I;G-T86YC97,-"@DG)S$O,B! (#,O-" K(%0@ M(#) ,R K(%0G)R @+3X@(" @("AD:71T;RD@8V]N=F5R=&5D(&-O<G)E8W1L M>2P@5" Z/2!A3G5M8F5R#0H))R<C;VYE("T^(#$@(W1W;R M/B R)R<@("T^ M(&%N3W)D97)E9$-O;&QE8W1I;VX@;V8@8V]R<F5S<&]N9&EN9R!!<W-O8VEA M=&EO;G,-"@T*26YV86QI9"!%>'!R97-S:6]N<SH-"@DG)S% ,B K(&QO8V%L M5F%R:6%B;&4G)R @+3X@97)R;W(-"@DG)T @,4 R)R<-"@DG)S% ,D G)PT* M)RX-"@T*#0IP86-K86=E(&UE=&AO9$YA;65S#0H)861D.B C4W1R:6YG("T^ M(",K.PT*"6%D9#H@(U-T<FEN9R M/B C87-,:71E<F%L.PT*"6%D9#H@(U-T M<FEN9R M/B C9V5T4&]S:71I;VX[#0H)>6]U<G-E;&8N#0H-"G!A8VMA9V4@ M8FEN87)Y1VQO8F%L3F%M97,Z("A3970@;F5W#0H)>6]U<G-E;&8I+@T*#0IP M86-K86=E(&=L;V)A;$%L:6%S97,Z("A3970@;F5W#0H)>6]U<G-E;&8I+@T* M#0IP86-K86=E(&%L;%)E<V]U<F-E3F%M97,Z("A3970@;F5W#0H)>6]U<G-E M;&8I+@T*#0IP86-K86=E('-E=%!R97)E<75I<VET97,Z("A)9&5N=&ET>5-E M="!N97<-"@EA9&0Z("<N+EPN+EQ$;VQP:&EN(#5<4')O:F5C=',@+2!I;6%G M97-<4'5Z>FQE,T1<3V)J96-T($%R='-<1&]L<&AI;EQ"87-E7$1O;'!H:6XG M.PT*"6%D9#H@)RXN7"XN7$1O;'!H:6X@-5Q0<F]J96-T<R M(&EM86=E<UQ0 M=7IZ;&4S1%Q/8FIE8W0@07)T<UQ$;VQP:&EN7%-Y<W1E;5Q#;VUP:6QE<EQ3 M;6%L;'1A;&L@4&%R<V5R)SL-"@EY;W5R<V5L9BDN#0H-"G!A8VMA9V4A#0H- M"B)#;&%S<R!$969I;FET:6]N<R(A#0H-"@T*(D=L;V)A;"!!;&EA<V5S(B$- M"@T*#0HB3&]O<V4@365T:&]D<R(A#0H-"B%3=')I;F<@;65T:&]D<T9O<B$- M"@T**R!A<'!E;F1E9%-T<FEN9PT*(D%N<W=E<B!A(&YE=R!S=')I;F<@=VAI M8V@@:7,@82!C;W!Y(&]F('1H92!R96-E:79E<B!W:71H(#Q3=')I;F<^(&%P M<&5N9&5D4W1R:6YG(&%P<&5N9&5D('1O(&ET(@T*#0I\(&%N<R!\#0HC2E1! M9&1E9"X-"F%P<&5N9&5D4W1R:6YG(&-L87-S(#T@4W1R:6YG(&EF1F%L<V4Z M(%L@<V5L9B!E<G)O<CH@)T%R9W5M96YT(&UU<W0@8F4@82!3=')I;F<G(%TN M#0IA;G,@.CT@<V5L9B!C;W!Y(')E<VEZ93H@<V5L9B!S:7IE("L@87!P96YD M9613=')I;F<@<VEZ92X-"F%N<R!R97!L86-E1G)O;3H@<V5L9B!S:7IE("L@ M,2!T;SH@86YS('-I>F4@=VET:#H@87!P96YD9613=')I;F<@<W1A<G1I;F=! M=#H@,2X-"EYA;G,A#0H-"F%S3&ET97)A; T*#0HB5')E870@=&AE(')E8V5I M=F5R(&%S(&$@=7-E<B!L:71E<F%L('1H870@8V]N<VES=',@;V8@<VUA;&QT M86QK(&5X<')E<W-I;VYS('-E<&5R871E9"!B>2!S<&%C97,@:6YS=&5A9"!O M9B!P97)I;V1S(&%N9"!A;G-W97(@86Y/<F1E<F5D0V]L;&5C=&EO;B!O9B!E M86-H(&5X<')E<W-I;VX@979A;'5A=&5D+B @5&AU<R!F;W(@96<L(&EF(')E M8V5I=F5R(#T@("<Q0#(@(#- -"<@=&AE;B!T:&4@86YS=V5R('=I;&P@8F4@ M86Y/<F1E<F5D0V]L;&5C=&EO;B @;V8@4&]I;G0@:6YS=&%N8V5S(@T*#0I\ M(')E<W5L="!M97-S86=E<R!P;W,@;&ET97)A;"!P;V]L<R!C;VUP:6QA=&EO M;E)E<W5L="!\#0H-"B-*5&%D9&5D+@T*;65S<V%G97,@.CT@3W)D97)E9$-O M;&QE8W1I;VX@;F5W+B -"G-E;&8@:7-%;7!T>2!I9E1R=64Z(%L@7FUE<W-A M9V5S(%TN#0H-"B)4:&4@9F]L;&]W:6YG(')E;&EE<R!O;B!T:&4@4VUA;&QT M86QK('-Y<W1E;2!C;&%S<R!3;6%L;'1A;&M087)S97(@=&\@9&\@=&AE('=O M<FL@;V8@<&%R<VEN9R!O=70@;65S<V%G97,@9G)O;2!T:&4@<F5C96EV97(N M($YO<FUA;&QY('1H97-E('=O=6QD(&)E('-E<&5R871E9"!B>2!P97)I;V1S M+"!B=70@:6X@=&AI<R!C87-E+"!S:6YC92!W92!W86YT('1O(&EM<&QE;65N M="!A;B!A;'1E<FYA=&EV92!T;R C*"D@87,@86X@87)R87D@;&ET97)A;"P@ M=&AE>2!A<F4@<V5P97)A=&5D(&)Y('-P86-E(&-H87)A8W1E<G,B#0H-"FQI M=&5R86P@.CT@<V5L9B!T<FEM0FQA;FMS+B B;F5C97-S87)Y(&9O<B!S;VUE M('!O<W-I8FQE(')E8V5I=F5R(&5R<F]R<R(-"B@@)T O/EPJ)EXK+3T\6WLG M("!I;F-L=61E<SH@;&ET97)A;"!L87-T*2 @(F-H96-K(&9O<B!S:6YG;&4@ M<F]G=64@8VAA<F%C=&5R(&%T(&5N9"!O9B!R96-E:79E<B(-"@EI9E1R=64Z M(%L@<V5L9B!E<G)O<CH@)U-T<FEN9R!S=7!P;&EE9"!C;VYT86EN<R!A;B!E M<G)O<B!A="!L87-T('!O<VET:6]N)R!=+B -"FQI=&5R86P@.CT@;&ET97)A M;"!C;W!Y("L@)R C82<N(" B9F]R8V4@;F]N+65R<F]R(&%T(&5N9"!O9B!S M=')I;F<B#0H-"BAP;W,@.CT@;&ET97)A;"!G9710;W-I=&EO;BD@/B R(&EF M1F%L<V4Z(%L@<V5L9B!E<G)O<CH@)U-T<FEN9R!S=7!P;&EE9"!C;VYT86EN M<R!A;B!E<G)O<B!A="!F:7)S="!P;W-I=&EO;B<@72X@(")E9RX@97AP<F5S M<VEO;B ]("= ("XN)R L("<]("XN)RP@971C(@T*6R!M97-S86=E<R!A9&0Z M("AL:71E<F%L(&QE9G13=')I;F<Z('!O<R M(#(I+@T*;&ET97)A;" Z/2!L M:71E<F%L(')I9VAT4W1R:6YG.B!L:71E<F%L('-I>F4@+2!P;W,@*R Q+@T* M*'!O<R Z/2!L:71E<F%L(&=E=%!O<VET:6]N*2 ^(# @72!W:&EL951R=64N M#0HB7FUE<W-A9V5S+B(-"G)E<W5L=" Z/2!/<F1E<F5D0V]L;&5C=&EO;B!N M97<N#0IP;V]L<R Z/2 H3W)D97)E9$-O;&QE8W1I;VX@=VET:#H@4&]O;$1I M8W1I;VYA<GD@;F5W*2!A<T%R<F%Y+B B;6%N9&%T;W)Y(@T*(D-O;G9E<G0@ M96%C:"!E>'!R97-S:6]N('1O(&%#;VUP:6QA=&EO;E)E<W5L="P@979A;'5A M=&4@:70@86YD(&-O;&QE8W0Z(@T*;65S<V%G97,@9&\Z(%L@.F5X<')E<W-I M;VX@?" -"@D)6R!C;VUP:6QA=&EO;E)E<W5L=" Z/2!#;VUP:6QE<B -"@D) M"6-O;7!I;&5&;W)%=F%L=6%T:6]N.B!E>'!R97-S:6]N( T*"0D):6XZ(%5N M9&5F:6YE9$]B:F5C=" -"@D)"65V86QU871I;VY0;V]L<SH@<&]O;',@#0H) M"0EL;V=G960Z('1R=64@#0H)"0EF;&%G<SH@-3$V+@T*"0ER97-U;'0@861D M.B H8V]M<&EL871I;VY297-U;'0@;65T:&]D('9A;'5E.B!N:6PI+@T*"0E= M(&]N.B!#;VUP:6QE<E=A<FYI;F=.;W1I9FEC871I;VX-"@D)9&\Z(%L@.F-W M('P@<V5L9B!E<G)O<CH@)U-U<'!L:65D(%-T<FEN9R!C;VYT86EN<R!E<G)O M<G,G(%T-"@D);VXZ($-O;7!I;&5R17)R;W).;W1I9FEC871I;VX-"@D)9&\Z M(%L@.F-N('P@<V5L9B!E<G)O<CH@)U-U<'!L:65D(%-T<FEN9R!C;VYT86EN M<R!E<G)O<G,G(%U=+@T*7G)E<W5L= T*(0T*#0IG9710;W-I=&EO;@T*#0HB M:&5L<&5R(&9O<B!T:&4@(V%S3&ET97)A;"!M971H;V0N(%1H:7,@:&%S('1O M(&)E('5S960@8F5C875S92!T:&4@7G!O<R!M97-S86=E(&-A=7-E<R!A(')E M='5R;B!.3U0@9G)O;2!T:&4@8FQO8VL@979A;'5A=&EN9R!M971H;V0@8G5T M(&9R;VT@=&AI<R!M971H;V0N($%N<W=E<B!E:71H97(@=&AE('-T87)T:6YG M('!O<VET:6]N('=I=&AI;B!T:&4@<F5C96EV97(@;V8@=&AE(&YE>'0@<&5N M9&EN9R!M97-S86=E(&]R('1R=64B#0H-"B-*5&%D9&5D+@T*#0I3;6%L;'1A M;&M087)S97(@<&%R<V5%>'!R97-S:6]N.B!S96QF(&]N17)R;W(Z(%LZ97)R M(#IP;W,@?"!><&]S(%TN#0I>," @(F%T(&5N9"!L87-T(&UE<W-A9V4@:6X@ M<W1R:6YG(@T*(2 A#0HA4W1R:6YG(&-A=&5G;W)I97-&;W(Z(",K(4I4(&%D M9&5D(7!U8FQI8R$@(0T*(5-T<FEN9R!C871E9V]R:65S1F]R.B C87-,:71E M<F%L(4I4(&%D9&5D(6]P97)A=&EO;G,A<'5B;&EC(2 A#0HA4W1R:6YG(&-A M=&5G;W)I97-&;W(Z("-G9710;W-I=&EO;B%*5"!A9&1E9"%O<&5R871I;VYS M(7!R:79A=&4A("$-"@T*(D5N9"!O9B!P86-K86=E(&1E9FEN:71I;VXB(0T* M#0HB4V]U<F-E($=L;V)A;',B(0T*#0HB0VQA<W-E<R(A#0H-"B)":6YA<GD@ =1VQO8F%L<R(A#0H-"B)297-O=7)C97,B(0T*#0H` ` end |
John,
> I have attached a package consisting of 3 String methods one of which is the > single user method - String>>asLiteral > Instead of using an Array literal to input data, a String is used and the > data is entered as per Array literal. This is parsed into it's component > Smalltalk expressions and then each expression evaluated by native Dolphin > base messages. The result is an OrderedCollection of correspondingly ordered > objects. That's an interesting idea, but I suspect that it would be much slower than | out | out := Array writeStream. out nextPut:1@2; nextPut:3@4; nextPut;'etc.'. out contents. which is what I usually do under these circumstances. Another approach is OrderedCollection new add:2@3; add:'etc.'; yourself. Parsing and evaluating has uses of course. There have been some questions recently about web features for Dolphin. You might combine this with FastCGI and Apache to allow Smalltalk expressions to be embedded in web pages. I recently started doing something similar with replacing pieces of LaTeX source based on Smalltalk expressions. Have a good one, Bill -- Wilhelm K. Schwab, Ph.D. [hidden email] |
Hi Bill,
Thanks for your reply. I'm sure your correct. However I wanted an easy way to enter data programmatically which I first thought sometime ago Array literals would do. Obviously this is going to be slower but the convenience afforded by having an alternative array-like literal in most circumstances would far outweigh the shortcomings. For example, who'd want to use OrderedCollection new add: #one->1; add: #two->2; add: #three->3; add: #four->4; ......; add: #twenty->20. When you could just use '#one -> 1 #two -> 2 #three -> 3 #four -> 4 ..... #four -> 20' asLiteral Regards, John "Bill Schwab" <[hidden email]> wrote in message news:[hidden email]... > John, > > > I have attached a package consisting of 3 String methods one of which is > the > > single user method - String>>asLiteral > > Instead of using an Array literal to input data, a String is used and the > > data is entered as per Array literal. This is parsed into it's component > > Smalltalk expressions and then each expression evaluated by native Dolphin > > base messages. The result is an OrderedCollection of correspondingly > ordered > > objects. > > That's an interesting idea, but I suspect that it would be much slower than > > | out | > out := Array writeStream. > out > nextPut:1@2; > nextPut:3@4; > nextPut;'etc.'. > out contents. > > which is what I usually do under these circumstances. Another approach is > > OrderedCollection new > add:2@3; > add:'etc.'; > yourself. > > Parsing and evaluating has uses of course. There have been some questions > recently about web features for Dolphin. You might combine this with > FastCGI and Apache to allow Smalltalk expressions to be embedded in web > pages. I recently started doing something similar with replacing pieces > LaTeX source based on Smalltalk expressions. > > Have a good one, > > Bill > > -- > Wilhelm K. Schwab, Ph.D. > [hidden email] > > > |
[hidden email] (John Trinder) wrote (abridged):
> For example, who'd want to use > > OrderedCollection new add: #one->1; add: #two->2; add: #three->3; add: > #four->4; ......; add: #twenty->20. > > When you could just use > > '#one -> 1 #two -> 2 #three -> 3 #four -> 4 ..... #four -> 20' asLiteral I think I prefer the first version. The verbosity of specifying the collection type is offset by the benefit of being able to choose the type. Admittedly #add: is not very convenient, mainly because it returns the element instead of the container and partly because as a keyword message it tends to get itself glued up syntactically. If I had to do a lot of literal arrays I would probably add a #<<: message to the collection protocol. In simple cases it becomes: array := OrderedCollection << 1 << 2 << 3 << 4. Some cases now need brackets: array := OrderedCollection << (#one->1) << (#two->2) << (#three->3). but I don't mind that. It's at least clear what is going on. I dislike your #asLiteral for two reasons. First, I think it's error prone and harder to read because there's no separator between expressions. Secondly, I dislike making up message selectors from expressions because it affects optimisation and makes it harder to see where all the selectors are. -- Dave Harris, Nottingham, UK |
In reply to this post by John Trinder
"John Trinder" <[hidden email]> wrote in message
news:3f76e33d$[hidden email]... > ... > For example, who'd want to use > > OrderedCollection new add: #one->1; add: #two->2; add: #three->3; add: > #four->4; ......; add: #twenty->20. > > When you could just use > > '#one -> 1 #two -> 2 #three -> 3 #four -> 4 ..... #four -> 20' asLiteral > Or you could use ##() expressions if compile time construction is appropriate (and I guess it would be since construction of literal arrays seems to be what you have in mind): #(##(#one->1) ##(#two->2) ##(#three -> 3) ... ##(#twenty -> 20)) This is not so easy on the eye*, but it will carry no runtime overhead. A further advantage is that the symbols and any object references in the array will be visible to the reflection facilities of the language, and so the browsers, automatic package dependency tracking, and image stripper will be able to see them. Regards Blair *We'd have preferred a different, "lighter", syntax (such as the use of curly brackets) but at the time we introduced compile time expression evaluation Visual Age had already settled on ##(), so we went along with that. It's a shame the same attitude has not prevailed over the introduction of namespace separators into the various Smalltalks. |
Free forum by Nabble | Edit this page |