Changeset 503

Show
Ignore:
Timestamp:
01/21/08 16:21:29 (8 months ago)
Author:
krobillard
Message:

Iter/each can now take skip value on stack. Each.set works again.

Location:
trunk/thune
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • trunk/thune/boot.c

    r502 r503  
    7676  "  forever drop\n" 
    7777  "] 'loop func :loop.to\n" 
     78  "[ser words block! body block!]\n" 
     79  "[\n" 
     80  "    ser [words set body do] words length? iter\n" 
     81  "]\n" 
     82  "'loop func :each.set    ;(ser words body -- )\n" 
    7883  "[ser accu op] [\n" 
    7984  "  ser [first accu op do :accu] iter\n" 
  • trunk/thune/doc/UserManual

    r499 r503  
    365365iter      (ser body -- )             Iterate over series. 
    366366iter/N    (ser body -- )             Iterate over series with skip. 
     367each      (ser body -- )             Iterate over series elements. 
     368each/N    (ser body -- )             Iterate over series elements with skip. 
    367369proc      (body -- proc)             Create procedure. 
    368370func      (sig body -- func)         Create function with local values. 
     
    388390Word      Stack Usage                Function 
    389391========  =========================  ============================ 
    390 each      (ser body -- )             Iterate over series and take first element. 
    391392each.set  (ser words body -- )       Iterate over series and assign elements. 
    392393while     (body cond -- )            Evaluate body while cond is true. 
  • trunk/thune/mkboot.t

    r502 r503  
    8686] 'loop func :loop.to 
    8787 
     88[ser words block! body block!] 
     89[ 
     90    ser [words set body do] words length? iter 
     91] 
     92'loop func :each.set    ;(ser words body -- ) 
     93 
    8894[ser accu op] [ 
    8995  ser [first accu op do :accu] iter 
  • trunk/thune/tests/working/compare.t

    r502 r503  
    2121    first :cmp 
    2222 
    23     ;data [a b] [ 
    24     ;    [a b dup2 cmp do] print 
    25     ;] each.set 
    26  
    27     data [ 
    28         [a b] set 
     23    data [a b] [ 
    2924        [a b dup2 cmp do] print 
    30     ] iter/2 
     25    ] each.set 
    3126] proc :test 
    3227 
     
    4136 
    4237"--- if ---" print 
    43 data 
    44    ;[a b] 
     38data [a b] 
    4539[ 
    46     [a b] set 
    4740    [a b ' ' 
    4841        a b if/eq '= 
     
    5447    ] print 
    5548] 
    56 ;each.set 
    57 iter/2 
     49each.set 
  • trunk/thune/tests/working/control.good

    r502 r503  
    4545each "two" 
    4646each "tree" 
     47--- each.set 0 --- 
     48--- each.set 1 --- 
     491 
     502 
     51a 
     52b 
     53one 
     54two 
     55tree 
     56--- each.set 2 --- 
     571 2 
     58a b 
     59one two 
     60tree none 
     61--- each.set 3 --- 
     621 2 a 
     63b one two 
     64tree none none 
     65--- each.set 8 --- 
     661 2 a b one two tree none 
    4767--- either --- 
    4868'T' 
  • trunk/thune/tests/working/control.t

    r502 r503  
    2727 
    2828 
    29 /* 
    3029"--- each.set 0 ---" print 
    3130data tail [a] [[a] print] each.set 
     
    4241"--- each.set 8 ---" print 
    4342data [a b c d e f g h] [[a b c d e f g h] print] each.set 
    44 */ 
    4543 
    4644 
  • trunk/thune/tests/working/iter.good

    r498 r503  
    1919[x] 
    2020--- Reverse empty --- 
     21--- Skip on stack --- 
     22"A-message" 
  • trunk/thune/tests/working/iter.t

    r498 r503  
    2525[] [.] iter/-1 
    2626 
     27"--- Skip on stack ---" print 
     28{} {A - m e s s a g e} [append] 2 each head . 
  • trunk/thune/tests/working/parse2.good

    r502 r503  
    1616 
    1717 
    18 [words string!  file string!  rev logic!  | rules a b ab --] 
     18[words string!  file string!  rev logic!  | rules a b --] 
    1919[ 
    2020    [] copy :rules 
    2121    words parse.white 
    2222 
    23     [[b a] [a b]] rev pick :ab 
     23    [[b a] [a b]] rev pick 
    2424    [ 
    25         ab set 
    2625        rules [a (b prin) |] copy 'a infuse append.cat tail prev mark.eol drop 
    2726    ] 
    28     iter/2 
     27    each.set 
    2928 
    3029    file read 
  • trunk/thune/tests/working/parse2.t

    r502 r503  
    1616 
    1717 
    18 [words string!  file string!  rev logic!  | rules a b ab --] 
     18[words string!  file string!  rev logic!  | rules a b --] 
    1919[ 
    2020    [] copy :rules 
    2121    words parse.white 
    2222 
    23     [[b a] [a b]] rev pick :ab 
     23    [[b a] [a b]] rev pick 
    2424    [ 
    25         ab set 
    2625        rules [a (b prin) |] copy 'a infuse append.cat tail prev mark.eol drop 
    2726    ] 
    28     iter/2 
     27    each.set 
    2928 
    3029    file read 
  • trunk/thune/thune.c

    r502 r503  
    601601                    break; 
    602602 
    603                 case OP_ITER:           // (series blk -- ) 
     603                case OP_ITER:           // (series blk [skip] -- ) 
    604604                case OP_EACH: 
    605                     if( ur_is(UR_TOS, UT_BLOCK) && 
    606                         (ur_itLen( ut, ur_s_prev(UR_TOS) ) > 0) ) 
    607                     { 
    608                         int itype = (ur_opcode(val) == OP_ITER) ? 
     605                { 
     606                    int itype; 
     607                    int skip; 
     608 
     609                    if( ur_is(UR_TOS, UT_INT) ) 
     610                    { 
     611                        skip = ur_int(UR_TOS); 
     612                        UR_S_DROP; 
     613                    } 
     614                    else 
     615                    { 
     616                        skip = ur_sel(val); 
     617                    } 
     618 
     619                    if( ! ur_is(UR_TOS, UT_BLOCK) ) 
     620                    { 
     621                        ur_throwErr( UR_ERR_DATATYPE, 
     622                             "iter/each expected block! for body" ); 
     623                        goto throw_cc; 
     624                    } 
     625 
     626                    if( ur_itLen( ut, ur_s_prev(UR_TOS) ) > 0 ) 
     627                    { 
     628                        itype = (ur_opcode(val) == OP_ITER) ? 
    609629                                    CC_ITER : CC_EACH; 
    610                         int skip = ur_sel(val); 
    611                         if( skip == 0 ) 
    612                             skip = 1; 
    613630 
    614631                        PUSHC_EVAL( blkN, start, pc ); 
     
    620637                        //ur_copyCell( ut->toc, UR_TOS ); 
    621638                        UR_TOC->iter.code = itype; 
    622                         UR_TOC->iter.skip = skip; 
     639                        UR_TOC->iter.skip = skip ? skip : 1; 
    623640                        ut->toc->series.n   = UR_TOS->series.n; 
    624641                        ut->toc->series.it  = UR_TOS->series.it; 
     
    634651                        UR_S_DROPN(2); 
    635652                    } 
     653                } 
    636654                    break; 
    637655