Plot2kill 0.2
Nick Sabalausky
a at a.a
Sat Mar 5 16:31:23 PST 2011
"Robert Jacques" <sandford at jhu.edu> wrote in message
news:op.vrvz7do126stm6 at sandford.myhome.westell.com...
> On Sat, 05 Mar 2011 13:42:32 -0500, bearophile <bearophileHUGS at lycos.com>
> wrote:
>
>> dsimcha:
>>
>>> I've done some major updating of my Plot2kill plotting library lately,
>>
>> I see code that wants named arguments :-)
>>
>> 65 auto sleepinessFig = Figure(sleepinessPlot)
>> 66 .title("Sleepiness Survey")
>> 67 .yLabel("Sleepiness Rating")
>> 68 .xLabel("Activity")
>> 69 .legendLocation(LegendLocation.right)
>> 70 .horizontalGrid(true)
>> 71 .xTickLabels(
>> 72 iota(3),
>> 73 ["In Meeting", "On Phone", "Coding"]
>> 74 );
>>
>> Bye,
>> bearophile
>
> Why? Each of those arguments should be able to be set after creation. So
> given DRY principals, method chaining is the way to go. Besides, Figure
> takes a variable number of plot arguments, which means you couldn't
> support default arguments (at least with the current syntax).
I've also attached this as a file in case it's hard to read on the NG
clients:
--------------------------------------------------
// Tested on DMD 2.050
import std.variant;
template Optional(T)
{
alias Algebraic!(T) Optional;
}
template notSpecified(T)
{
Optional!T notSpecified;
}
Optional!T specified(T)(T val)
{
return Optional!T(val);
}
void setIfSpecified(T)(ref T target, Optional!T val)
{
if(val.hasValue())
target = val.get!T();
}
struct Plot
{
string name;
}
struct Fancy
{
string memberVar1;
int[] memberVar2;
bool memberVar3;
// I don't know why I need this or why it seems to need to be called
manually.
const int opCmp(ref const Fancy other)
{
return
memberVar1 == other.memberVar1 &&
memberVar2 == other.memberVar2 &&
memberVar3 == other.memberVar3;
}
}
struct Figure
{
Plot plot;
string title;
bool horizontalGrid;
Fancy fancy;
this(Plot plot)
{
this.plot = plot;
}
ref Figure set(
Optional!string title = notSpecified!string,
Optional!bool horizontalGrid = notSpecified!bool,
Optional!Fancy fancy = notSpecified!Fancy
)
{
setIfSpecified!string(this.title, title);
setIfSpecified!bool (this.horizontalGrid, horizontalGrid);
setIfSpecified!Fancy (this.fancy, fancy);
return this;
}
}
void main()
{
// All of the ugly 'specified()' could be eliminated if there
// were some sort of opImplicitCast
auto fig = Figure(Plot("My Plot"))
.set(
specified("My Title"),
specified(true),
specified(Fancy("Foo", [1,2,3], true))
);
assert(fig.title == "My Title");
assert(fig.horizontalGrid == true);
assert(fig.fancy.opCmp( Fancy("Foo", [1,2,3], true) ));
fig = fig.set().set().set();
assert(fig.title == "My Title");
assert(fig.horizontalGrid == true);
assert(fig.fancy.opCmp( Fancy("Foo", [1,2,3], true) ));
fig = fig.set( specified("New title name") );
assert(fig.title == "New title name");
assert(fig.horizontalGrid == true);
assert(fig.fancy.opCmp( Fancy("Foo", [1,2,3], true) ));
// The above maybe aren't so special as-is, but with named arguments
// the following could be uncommented and used:
/+
fig = fig.set(
fancy: specified(Fancy("Bar", [7,9,12], false)),
title: specified("Another Title")
);
assert(fig.title == "Bar");
assert(fig.horizontalGrid == true);
assert(fig.fancy.opCmp( Fancy("Bar", [7,9,12], false) ));
+/
}
--------------------------------------------------
begin 666 plotStuff2.d
M+R\@5&5S=&5D(&]N($1-1" R+C U, T*:6UP;W)T('-T9"YV87)I86YT.PT*
M#0IT96UP;&%T92!/<'1I;VYA;"A4*0T*>PT*"6%L:6%S($%L9V5B<F%I8R$H
M5"D at 3W!T:6]N86P[#0I]#0H-"G1E;7!L871E(&YO=%-P96-I9FEE9"A4*0T*
M>PT*"4]P=&EO;F%L(50@;F]T4W!E8VEF:65D.PT*?0T*#0I/<'1I;VYA;"%4
M('-P96-I9FEE9"A4*2A4('9A;"D-"GL-"@ER971U<FX at 3W!T:6]N86PA5"AV
M86PI.PT*?0T*#0IV;VED('-E=$EF4W!E8VEF:65D*%0I*')E9B!4('1A<F=E
M="P at 3W!T:6]N86PA5"!V86PI#0I[#0H):68H=F%L+FAA<U9A;'5E*"DI#0H)
M"71A<F=E=" ]('9A;"YG970A5"@I.PT*?0T*#0IS=')U8W0 at 4&QO= T*>PT*
M"7-T<FEN9R!N86UE.PT*?0T*#0IS=')U8W0 at 1F%N8WD-"GL-"@ES=')I;F<@
M;65M8F5R5F%R,3L-"@EI;G1;72 @;65M8F5R5F%R,CL-"@EB;V]L(" @;65M
M8F5R5F%R,SL-"@D-"@DO+R!)(&1O;B=T(&MN;W<@=VAY($D@;F5E9"!T:&ES
M(&]R('=H>2!I="!S965M<R!T;R!N965D('1O(&)E(&-A;&QE9"!M86YU86QL
M>2X-"@EC;VYS="!I;G0@;W!#;7 H<F5F(&-O;G-T($9A;F-Y(&]T:&5R*0T*
M"7L-"@D)<F5T=7)N#0H)"0EM96UB97)687(Q(#T](&]T:&5R+FUE;6)E<E9A
M<C$@)B8-"@D)"6UE;6)E<E9A<C(@/3T@;W1H97(N;65M8F5R5F%R,B F)@T*
M"0D);65M8F5R5F%R,R ]/2!O=&AE<BYM96UB97)687(S.PT*"7T-"GT-"@T*
M<W1R=6-T($9I9W5R90T*>PT*"5!L;W0@("!P;&]T.PT*"7-T<FEN9R!T:71L
M93L-"@EB;V]L(" @:&]R:7IO;G1A;$=R:60[#0H)1F%N8WD@(&9A;F-Y.PT*
M"0T*"71H:7,H4&QO="!P;&]T*0T*"7L-"@D)=&AI<RYP;&]T(#T@<&QO=#L-
M"@E]#0H)#0H)<F5F($9I9W5R92!S970H#0H)"4]P=&EO;F%L(7-T<FEN9R!T
M:71L92 @(" @(" @(" ](&YO=%-P96-I9FEE9"%S=')I;F<L#0H)"4]P=&EO
M;F%L(6)O;VP@("!H;W)I>F]N=&%L1W)I9" ](&YO=%-P96-I9FEE9"%B;V]L
M+ T*"0E/<'1I;VYA;"%&86YC>2 @9F%N8WD@(" @(" @(" @/2!N;W13<&5C
M:69I960A1F%N8WD-"@DI#0H)>PT*"0ES971)9E-P96-I9FEE9"%S=')I;F<H
M=&AI<RYT:71L92P@(" @(" @(" @=&ET;&4I.PT*"0ES971)9E-P96-I9FEE
M9"%B;V]L(" H=&AI<RYH;W)I>F]N=&%L1W)I9"P@:&]R:7IO;G1A;$=R:60I
M.PT*"0ES971)9E-P96-I9FEE9"%&86YC>2 H=&AI<RYF86YC>2P@(" @(" @
M(" @9F%N8WDI.PT*"0ER971U<FX@=&AI<SL-"@E]#0I]#0H@( T*=F]I9"!M
M86EN*"D-"GL-"@DO+R!!;&P@;V8@=&AE('5G;'D@)W-P96-I9FEE9"@I)R!C
M;W5L9"!B92!E;&EM:6YA=&5D(&EF('1H97)E#0H)+R\@=V5R92!S;VUE('-O
M<G0@;V8@;W!);7!L:6-I=$-A<W0-"@D-"@EA=71O(&9I9R ]($9I9W5R92A0
M;&]T*")->2!0;&]T(BDI#0H)"2YS970H#0H)"0ES<&5C:69I960H(DUY(%1I
M=&QE(BDL#0H)"0ES<&5C:69I960H=')U92DL#0H)"0ES<&5C:69I960H1F%N
M8WDH(D9O;R(L(%LQ+#(L,UTL('1R=64I*0T*"0DI.PT*"0D-"@EA<W-E<G0H
M9FEG+G1I=&QE(#T](")->2!4:71L92(I.PT*"6%S<V5R="AF:6<N:&]R:7IO
M;G1A;$=R:60@/3T@=')U92D[#0H)87-S97)T*&9I9RYF86YC>2YO<$-M<"@@
M1F%N8WDH(D9O;R(L(%LQ+#(L,UTL('1R=64I("DI.PT*"0T*"69I9R ](&9I
M9RYS970H*2YS970H*2YS970H*3L-"@EA<W-E<G0H9FEG+G1I=&QE(#T](")-
M>2!4:71L92(I.PT*"6%S<V5R="AF:6<N:&]R:7IO;G1A;$=R:60@/3T@=')U
M92D[#0H)87-S97)T*&9I9RYF86YC>2YO<$-M<"@@1F%N8WDH(D9O;R(L(%LQ
M+#(L,UTL('1R=64I("DI.PT*"0T*"69I9R ](&9I9RYS970H('-P96-I9FEE
M9"@B3F5W('1I=&QE(&YA;64B*2 I.PT*"6%S<V5R="AF:6<N=&ET;&4@/3T@
M(DYE=R!T:71L92!N86UE(BD[#0H)87-S97)T*&9I9RYH;W)I>F]N=&%L1W)I
M9" ]/2!T<G5E*3L-"@EA<W-E<G0H9FEG+F9A;F-Y+F]P0VUP*"!&86YC>2 at B
M1F]O(BP at 6S$L,BPS72P@=')U92D@*2D[#0H)#0H)+R\@5&AE(&%B;W9E(&UA
M>6)E(&%R96XG="!S;R!S<&5C:6%L(&%S+6ES+"!B=70@=VET:"!N86UE9"!A
M<F=U;65N=',-"@DO+R!T:&4 at 9F]L;&]W:6YG(&-O=6QD(&)E('5N8V]M;65N
M=&5D(&%N9"!U<V5D. at T*"2\K#0H-"@EF:6<@/2!F:6<N<V5T* T*"0EF86YC
M>3H@<W!E8VEF:65D*$9A;F-Y*")"87(B+"!;-RPY+#$R72P at 9F%L<V4I*2P-
M"@D)=&ET;&4Z('-P96-I9FEE9"@B06YO=&AE<B!4:71L92(I#0H)*3L-"@EA
M<W-E<G0H9FEG+G1I=&QE(#T](")"87(B*3L-"@EA<W-E<G0H9FEG+FAO<FEZ
M;VYT86Q'<FED(#T]('1R=64I.PT*"6%S<V5R="AF:6<N9F%N8WDN;W!#;7 H
M($9A;F-Y*")"87(B+"!;-RPY+#$R72P at 9F%L<V4I("DI.PT*#0H)*R\-"GT-
!"@``
`
end
More information about the Digitalmars-d-announce
mailing list