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