Changeset 502

Show
Ignore:
Timestamp:
01/21/08 02:41:15 (7 months ago)
Author:
krobillard
Message:

Each is now an opcode. Iter & each now store the series on the control stack
so the body block can operate on data stack.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/thune/boot.c

    r488 r502  
    1818  "  opcode! 13 'proc    make :proc\n" 
    1919  "  opcode! 14 'iter    make :iter\n" 
    20   "  opcode! 15 'recurse make :recurse\n" 
    21   "; opcode! 16 'loop    make :xx-loop\n" 
     20  "  opcode! 15 'each    make :each\n" 
     21  "  opcode! 16 'recurse make :recurse\n" 
    2222  "  opcode! 17 'return  make :return\n" 
    2323  "  opcode! 18 'throw   make :throw\n" 
     
    7676  "  forever drop\n" 
    7777  "] 'loop func :loop.to\n" 
    78   "[ser body]\n" 
    79   "[\n" 
    80   "  ser [first body do] iter\n" 
    81   "] 'loop func :each     ;(ser body -- )\n" 
    82   "[ser words block! body block! | len-1]\n" 
    83   "[\n" 
    84   "   ;words [first word! verify drop] iter\n" 
    85   "   ser\n" 
    86   "   words length?\n" 
    87   "   dup dec :len-1\n" 
    88   "   [\n" 
    89   "     1  [words set            body do]\n" 
    90   "     2  [words set next       body do]\n" 
    91   "        [words set len-1 skip body do]\n" 
    92   "   ] select\n" 
    93   "   iter\n" 
    94   "]\n" 
    95   "'loop func :each.set       ; (ser words body -- )\n" 
    9678  "[ser accu op] [\n" 
    9779  "  ser [first accu op do :accu] iter\n" 
  • trunk/thune/gc.c

    r458 r502  
    394394 
    395395            case CC_ITER: 
     396            case CC_EACH: 
    396397                SET_BIT_BLOCK_L( it->cp.n ) 
    397398                it -= CC_LEN_ITER; 
  • trunk/thune/internal.h

    r490 r502  
    137137#define CC_REDUCE           5 
    138138#define CC_ITER             6 
    139 #define CC_CATCH            7 
    140 #define CC_TERM             8 
    141 #define CC_END              9 
     139#define CC_EACH             7 
     140#define CC_CATCH            8 
     141#define CC_TERM             9 
     142#define CC_END              10 
    142143#define CC_COUNT            (CC_END+1) 
    143144 
     
    191192#define OP_PROC             13 
    192193#define OP_ITER             14 
    193 #define OP_RECURSE          15 
    194 #define OP_LOOP             16 
     194#define OP_EACH             15 
     195#define OP_RECURSE          16 
    195196#define OP_RETURN           17 
    196197#define OP_THROW            18 
  • trunk/thune/mkboot.t

    r488 r502  
    1919  opcode! 13 'proc    make :proc 
    2020  opcode! 14 'iter    make :iter 
    21   opcode! 15 'recurse make :recurse 
    22 ; opcode! 16 'loop    make :xx-loop 
     21  opcode! 15 'each    make :each 
     22  opcode! 16 'recurse make :recurse 
    2323  opcode! 17 'return  make :return 
    2424  opcode! 18 'throw   make :throw 
     
    8686] 'loop func :loop.to 
    8787 
    88 [ser body] 
    89 [ 
    90   ser [first body do] iter 
    91 ] 'loop func :each     ;(ser body -- ) 
    92  
    93 [ser words block! body block! | len-1] 
    94 [ 
    95    ;words [first word! verify drop] iter 
    96  
    97    ser 
    98    words length? 
    99    dup dec :len-1 
    100    [ 
    101      1  [words set            body do] 
    102      2  [words set next       body do] 
    103         [words set len-1 skip body do] 
    104    ] select 
    105    iter 
    106 ] 
    107 'loop func :each.set       ; (ser words body -- ) 
    108  
    10988[ser accu op] [ 
    11089  ser [first accu op do :accu] iter 
  • trunk/thune/tests/working/compare.t

    r222 r502  
    2020[ 
    2121    first :cmp 
    22     data [a b] [ 
     22 
     23    ;data [a b] [ 
     24    ;    [a b dup2 cmp do] print 
     25    ;] each.set 
     26 
     27    data [ 
     28        [a b] set 
    2329        [a b dup2 cmp do] print 
    24     ] each.set 
     30    ] iter/2 
    2531] proc :test 
    2632 
     
    3541 
    3642"--- if ---" print 
    37 data [a b] [ 
     43data 
     44   ;[a b] 
     45
     46    [a b] set 
    3847    [a b ' ' 
    3948        a b if/eq '= 
     
    4453        a b if/gte '>= 
    4554    ] print 
    46 ] each.set 
    47  
     55
     56;each.set 
     57iter/2 
  • trunk/thune/tests/working/control.good

    r194 r502  
    4545each "two" 
    4646each "tree" 
    47 --- each.set 0 --- 
    48 --- each.set 1 --- 
    49 1 
    50 2 
    51 a 
    52 b 
    53 one 
    54 two 
    55 tree 
    56 --- each.set 2 --- 
    57 1 2 
    58 a b 
    59 one two 
    60 tree none 
    61 --- each.set 3 --- 
    62 1 2 a 
    63 b one two 
    64 tree none none 
    65 --- each.set 8 --- 
    66 1 2 a b one two tree none 
    6747--- either --- 
    6848'T' 
  • trunk/thune/tests/working/control.t

    r194 r502  
    2727 
    2828 
     29/* 
    2930"--- each.set 0 ---" print 
    3031data tail [a] [[a] print] each.set 
     
    4142"--- each.set 8 ---" print 
    4243data [a b c d e f g h] [[a b c d e f g h] print] each.set 
     44*/ 
    4345 
    4446 
  • trunk/thune/tests/working/parse2.good

    r232 r502  
    1616 
    1717 
    18 [words string!  file string!  rev logic!  | rules a b --] 
     18[words string!  file string!  rev logic!  | rules a b ab --] 
    1919[ 
    2020    [] copy :rules 
    2121    words parse.white 
    22     [[b a] [a b]] rev pick 
     22 
     23    [[b a] [a b]] rev pick :ab 
    2324    [ 
     25        ab set 
    2426        rules [a (b prin) |] copy 'a infuse append.cat tail prev mark.eol drop 
    2527    ] 
    26     each.set 
     28    iter/2 
    2729 
    2830    file read 
  • trunk/thune/tests/working/parse2.t

    r232 r502  
    1616 
    1717 
    18 [words string!  file string!  rev logic!  | rules a b --] 
     18[words string!  file string!  rev logic!  | rules a b ab --] 
    1919[ 
    2020    [] copy :rules 
    2121    words parse.white 
    22     [[b a] [a b]] rev pick 
     22 
     23    [[b a] [a b]] rev pick :ab 
    2324    [ 
     25        ab set 
    2426        rules [a (b prin) |] copy 'a infuse append.cat tail prev mark.eol drop 
    2527    ] 
    26     each.set 
     28    iter/2 
    2729 
    2830    file read 
  • trunk/thune/thune.c

    r499 r502  
    5151 
    5252            case CC_ITER: 
     53            case CC_EACH: 
    5354                toc -= CC_LEN_ITER; 
    5455                break; 
     
    352353    UR_C_GROW 
    353354 
    354  
    355 #define PUSHC_ITER(blkn,a,b,itSkip) \ 
    356     UR_TOC->cp.cell = a; \ 
    357     UR_C_GROW; \ 
    358     UR_TOC->iter.code = CC_ITER; \ 
    359     UR_TOC->iter.skip = itSkip; \ 
    360     UR_TOC->iter.n    = blkn; \ 
    361     UR_TOC->iter.cell = b; \ 
    362     UR_C_GROW 
    363  
    364 #define RESET_ITER(a,b) \ 
    365     b = UR_TOC->iter.cell; \ 
    366     a = UR_TOC[-1].cp.cell; \ 
    367     UR_C_GROW 
    368355 
    369356#define DO_BLOCK(vp) \ 
     
    615602 
    616603                case OP_ITER:           // (series blk -- ) 
     604                case OP_EACH: 
    617605                    if( ur_is(UR_TOS, UT_BLOCK) && 
    618606                        (ur_itLen( ut, ur_s_prev(UR_TOS) ) > 0) ) 
    619607                    { 
     608                        int itype = (ur_opcode(val) == OP_ITER) ? 
     609                                    CC_ITER : CC_EACH; 
    620610                        int skip = ur_sel(val); 
    621611                        if( skip == 0 ) 
    622612                            skip = 1; 
     613 
    623614                        PUSHC_EVAL( blkN, start, pc ); 
    624615                        SET_BLK_PC( UR_TOS->series.n, 
    625616                                    UR_TOS->series.it ); 
    626                         PUSHC_ITER( blkN, pc, end, skip ); 
    627  
    628                         // Loop code must drop TOS. 
    629                         *UR_TOS = UR_TOS[-1];   // drop dup 
     617 
     618                        ur_copyCell( ut->toc, UR_TOS[-1] ); 
     619                        UR_C_GROW; 
     620                        //ur_copyCell( ut->toc, UR_TOS ); 
     621                        UR_TOC->iter.code = itype; 
     622                        UR_TOC->iter.skip = skip; 
     623                        ut->toc->series.n   = UR_TOS->series.n; 
     624                        ut->toc->series.it  = UR_TOS->series.it; 
     625                        ut->toc->series.end = UR_TOS->series.end; 
     626                        UR_C_GROW; 
     627 
     628                        UR_S_DROP;      // Loop code must drop TOS. 
     629                        if( itype == CC_EACH ) 
     630                            ur_pick( ut, UR_TOS, 0, UR_TOS ); 
    630631                    } 
    631632                    else 
     
    10711072 
    10721073        case CC_ITER: 
     1074        case CC_EACH: 
    10731075        { 
    10741076            int skip = UR_TOC->iter.skip; 
    1075             UR_TOS->series.it += skip; 
    1076             if( ((skip > 0) ? ur_itLen(ut, UR_TOS) : UR_TOS->series.it + 1) 
     1077            UCell* ser = ut->toc - 1; 
     1078            ser->series.it += skip; 
     1079            if( ((skip > 0) ? ur_itLen(ut, ser) : ser->series.it + 1) 
    10771080                    > 0 ) 
    10781081            { 
    1079                 RESET_ITER( pc, end ); 
    1080                 UR_S_DUP;   // Loop code must drop TOS. 
     1082                UR_S_GROW;      // Loop code must drop TOS. 
     1083                if( UR_TOC->id.code == CC_EACH ) 
     1084                    ur_pick( ut, ser, 0, UR_TOS ); 
     1085                else 
     1086                    ur_copyCell(UR_TOS, *ser); 
     1087 
     1088                SET_BLK_PC( ut->toc->series.n, ut->toc->series.it ); 
     1089                UR_C_GROW; 
    10811090                goto execute; 
    10821091            } 
    10831092            UR_C_DEC; 
    1084             UR_S_DROP;           // Pop iterator value. 
    10851093        } 
    10861094            goto control; 
     
    11671175 
    11681176            case CC_ITER: 
     1177            case CC_EACH: 
    11691178                UR_C_DECN( CC_LEN_ITER ); 
    11701179                if( ur_is(UR_TOS, UT_WORD) && 
    11711180                    ur_atom(UR_TOS) == UR_ATOM_BREAK ) 
    11721181                { 
    1173                     UR_S_DROPN( 2 )
     1182                    UR_S_DROP
    11741183                    goto control; 
    11751184                }