From 1f7e6ecb365f97a1554e96e700fa90c3e0759e26 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 3 Oct 2023 20:59:18 -0400 Subject: [PATCH] generators, start converting swine meeper to use iteration --- assemble.com | Bin 12934 -> 12957 bytes common.jrt | 17 ++++----- defs.jrt | 1 + iter.jrt | 98 +++++++++++++++++++++++++++------------------------ swine.com | Bin 6646 -> 7444 bytes swine.jrt | 46 +++++++++++------------- zipoff.com | Bin 18756 -> 20160 bytes zipoff.jrt | 6 ++-- zipstub.seg | Bin 3198 -> 4288 bytes 9 files changed, 87 insertions(+), 81 deletions(-) diff --git a/assemble.com b/assemble.com index c1230acf4d9ee4d5e5ec000b28ff032fdc3aa542..2fda6b6c761d6fda85991b55ce4f431e432b8e21 100755 GIT binary patch delta 7562 zcmY*e3shazncipL7dJ5y!r?xF+$Zl#fcU^PP@XX%BwRxtL~9ko<)OJiFBfz1b&N|> z>ayzMc2Zk(Tv*#W5`0wFRL7dOlj-S_!L*L!jN=$J(PYLp&Qhb*Xj10;_db`TT{idp z|M$Q4KL7sze;*FS9*u=QJhSRtalEFudaU}(>Ky+i1*2;ls=lt7Dt9;|HAkwyTjN+e z`dnzrqCEQiZ!9lfqEw}CT{WM3Acr%5Ih$1`_l^XOW^Hg5N;`~nhE@MYcDsN;nrV#M9^pNV#-U)s-Q!G34Hh_0e`k-2Mdev+Gq4Bpbfq-U%97oQ{#cTIpd4}>&$Ah%AM{~IH8dIs`lDmDYGOU&`Gn&M zu>HjT%(2`7ws^KWosKNlJsOV;#1b(?ukv}T%1`H=Sf%o}H9VdZkNXjT%|XmbJmrd~ zQ+O&APha4v3{Sf9f@)=ZhU25Lezsn@q3AY;jmYla-UJIPOsND-&cK7OIzH!^RSr7# zTXgs(pLJXpoKu2xP7|y*!8+jhm0(c}b^K3)^KXJfvDEQ%g0tL8hA5^weyNkR{DLE6 zOQ~6`T<)76-cMt1mzicv=dh!P@;Iwcf;puGon;PP>0f1H`|5WQOXZveorPfj*kNIf z?d=`g!JXhyo^T#FO)9m{IPY<$kO~Z|8|hB&85kkG(|MChn^RYAaT;7~IC1BBVS2(5 z(&n6YwzqpUxwpF~wwHE?J?>o2hDRdtSbX1LZ*oBJ0uD24+P%FMs#D5ICvD7!&Mek5 zo{Wto6W;{;q;tPzN=cb@O}Wppg6$bgBw|C! z$nXgA2@W;a8_tyo0@P?E5sP;Z4h;?wz}Rk=RRYz5WcXhq!>U|46`8r*HR8I!Jjy`<37J(^LV7kGn!4+9>J$<=E8lmurGq1}DTGO2{{ zudd{|FELDy4MCFj_Y8baiv8W;&V(}qj0%x5FSutR_LiIS1v?n&F^s5uCHn~G6;B4) zw}dc(cs(nmPP*8gt&!~Io=hZ2JX)2?O(Mo?E(R`yNHvN?DA1cc*+vA=6{&wgE>}pL zL-td$4v!F$<5_U!c#fDCTz1zHv(A-g(!X>EwC{T|yWW$D_a#r1XM1xzah~HX_vp&U z9veKx5{cmi?ED%zzuR8NYrMXpSa-t5cH3VwSdHFwMDDgz<-Ja|v)Is{;ocZB9D2_} z=qjAqXT?Ff%#8yu5ZjaP@?4^w&TBR8@^+a{=TR0u>8;~G^9~Ln!3KMM*y6D`j){-b zaFng~>PoIRvvSn3k-f2GjJ9qFxk8oUly^!wYMS6fNUtb=$176WJM9|x#`z*lpZ6w* zhkfzxq4A9E`lPhm?^Re3miD_3!^{0n&Kj-*IjP);O~}p%c|AxzIPZ<}fg65>bcm%X(&m*SlD4G#52L`uM~Jc6H?PUO=m zeLa7fQ74B7ho~q{BZO}iP=b34=J`APl!cBnmC93=IRAD571#0tyHtvFS6=}glu?xA z8`C%DdoA>IOZu*SmqxXF#MUvC{k6@42uLILt zKoh_`C*SmYqyQxq8tnwmTaT!lSG`=w3ECibp479jK*(rtqjKv z2OH24F^0?=F=SrUs~#(B>MHNtbUph@nJ;AQ-wOq!#b7AxBr&2H2@UT5A~_im6I1d{ zEMvjUKF%|-3}#`r)h4J*>sEFdQC*UO8v@bTE|8V%S0I`t zk;7ggF-fdq&wyysB$dnlgOoN3C6&ETN|MN9ACrP`#4y!umD`E*yod$IUTkS`KFsMov1J+_t_3Yk4Gi&c?-YgV9 zX4O6m+twQ0daa;8WnF$V(ULsFs+}gbwIj;3uargKZT^RzE3~jJ9XmUlAin6k&;P^$ zzhvwZj4A(5BVaUdi5e1z{6BlrU`UCV{XZW-blY0D3x%WpBfrQov#$0=Ngwn7=YIj- z*e=PB{GYu@YiZJ?_BsE8<@Eo46VJR#Spn8aA+JHVn~q( z0<#08)7)rCJQjF*%3w%|X9Lg7i+$ZL!}@LDU;A^-Y}3~59U|=40!Lp(n42=Yay;;d zLjf$ay;;DY1isWh0^PY?(kyuPoPg;hE&8&9Uo8(3D#^m&*B+3~?Q)MI!E>bomE`*1 z`C3A^NK>1GpZ~bf#Mb>y-lc6b;?|_{RFLu$RadjTW0YOZm#LewNB_{joQfSfaQz-R z(uL3_sD3XlQlmZ`Oz|lt&fgBI+=?DVO@yYkSzvF0$8qC&J2gj{4fTM zgJBB#nsAi=AWTjU!nCfmgw3obfh#PkpGiY=-siWodK&-Aheyi5Eyw1*B2;rxk){!$ zuKYuIIjhIzQb=h+>}rU8EyU#YnKr4`GGof9yb3?{$RJp(b#4#Mh1BqZD-qU}#js5P zvQ=RsMUV@wd7f3IE3Tp}Rv$|xp+}*NdtUMkh?MFq$|{-;mm+H~E7A}zWO^9pb90BIxUm%yDt&dO-+s?+$%qFIH; z*=a22D$^8_{JEkP!X@qF?M7fz$m+vIZxmsmE-qE4@roM-R#xAi7}3^J=yVkS!c@Mdm^_RWr#N}|0-WnPXrYu6+BR^ zK#@}8=fx`jXIAT^y{DwOyO`R=_6<^Qc1i9Jkek0q?!6GIu!g!U?7bo6R32r&glj81 zCjLc*V2yZ}uN9l9Vhc%DLY`ILB_wT-oCNitkn0bdP%^1*rGh1fTm$4t;;(E?G5s#G z^RQ@#WJ_zaCPcRxq8lMPWr)(R6b+S-QR+6S;O#<^mOWQO3#Of;YgCjUDxu1=fCa{Z zsr*$u(c#`&l7%zd*C)Q8(9}<3>FK-~(@~t4U-af@t{`*=%8cXV9x5QRJklkxqnM7& zz%WLQo8scc{7*@guPvp6exziAzvY?6g)GXeOXpDnRQ?lG3wd_vz@1I|OL8^Rh(W^y z4JmaGq}q%_d1Wb*85e?#{omzB`GcjkPKu+=c(wBQ9xdXmje1fl_`_29CPtXO6d%z_ zO{{IJM4mN}?+D~jDQ8+6%>$|6yn!SHq6-~~yl)_*0(loYZ8Tz}g69n&DS)#=MIw$e z8Nir8R+S-urdFX-Wgxc*q@s*#tgTTXZ3ePWAREfyh6cJ+aE}3`1aJcx+bWUU4P;y( zDMF&s%|QdXRUnfBF?PT}ZWG9%G7WxcK*bIi$n65rN#|;5?R^8eLm=-G(k_wn26CrB z&Qj1<3uDf5xdWO2?h9Bkbacp3EfuUX!1n-Zx>8Y2BT0uC+)}|U26$X(ZYrmd&p2U& z26RF|xq#Z5yX21FV?gf<=&o{vxJ4ez#{_b@E6QIkSGfhXgO0AsKV+Mbb$_M+RsJWo z5C574NT=}XpqVw}bDUVqyGs`S3Jazs3;!!D@Fk@uLpI~?L?v__pCc6Sf{V_{AZ2k+ zJQ3L!7uVYSiYVV+L3KZ>@%D--1>b6mXc*|Kp!SbmRBWRTjsM70IZV<2$<(zKc1Gni z^HoNE^^jOu1$u&1gO=<%^L)W|FIMyr^y+&O2q7Ut=tBte@Z30Kit{%s?yjJo`ljLj z5dipbDO7Ow_H`#@HU1|keFd56a4nvAglhad>HjNtYebhs2$|p{b(wgkIxu5eaMe~U zVE;D=d2=LZX)o|?DUN{9`RRMtJoiA0mcKEAPIE|StD+>dKu>&k+gh^NJKrUleO_;uK-;LR<9h|$^ z=aDy%gD-g`66H5mPKV=spmN$pL1b4-+cjic<$q)gFi)oG%ipY-R{31zg5an;2W!!2 zIGBND+V41lE}A1KZKC{lM%0Ik;{1zB8V6p7*e1-k z7 zVim}-Y7JT$%uyqQun8=Nch=r2TYPm5?NGUA&NVKM#Wgi5|2_*L>wMUg#&#-$nFB<1 zi|T!64Un#j5qY%GBdSsD2k{jrS;n*riZu1j;v+aNI5pSRMEQ$wl7*^3bJrN?S3uhh zn#u}Eo)wZOYf!1hOqG#63(jF^(m5oauB^fmHfEI>~ee$Iw1avcPf&_#9dPUoldv4qM$O2`ls{0hf;C#+6nv#@MhELtivc| TooiFP%d{p-SJtPmuPOb1ayjGI0_l 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 diff --git a/common.jrt b/common.jrt index e6de62d..5a64081 100755 --- a/common.jrt +++ b/common.jrt @@ -1,17 +1,18 @@ -import text.jrt -import keys.jrt -import random.jrt -import file.jrt -import task.jrt -import timer.jrt -import beep.jrt - : !+ ( v p -- ) dup @ r dup >rot ! r@ if dup 0x100 - r@ seekto cell swap r@ fwrite rot ! ; +: !+ ( v p -- ) dup @ next always more convenient to check the flag first when consuming the result. ) : get-next ( -- c f ) 0 nextpeek execute swap ; : n-nextdrop ( c -- ) dup if begin nextdrop 1- dup not until then drop ; -: EACH_ r ; +: iteration get-next if drop 1 else n-nextdrop 0 then ; +: EACH_ r ; { ( Because we dereference pointers on the return stack, we must run this from the caller's segment. Copy the definition into the host segment. ) - : EACH_ r ; + : EACH_ r ; : each ' EACH_ , here 0 , ; immediate : continue ' GOTO_ , dup cell - , ; immediate - : more ['] continue here swap ! ; immediate + : next ['] continue here swap ! ; immediate :timm each t, EACH_ patchpt ; : CONTINUE t, GOTO_ dup cell - w>t ; :timm continue CONTINUE ; - :timm more CONTINUE patch!t ; } + :timm next CONTINUE patch!t ; } 0 var, cancelled : cancel 1 cancelled ! :| nextdrop get-next if idrop then 0 cancelled ! 0 swap |; >next ; +{ : break ' cancel , ['] continue ; immediate + :timm break t, cancel CONTINUE ; } : nothing :| 0 1 |; >next ; : single >i :| nextdrop :| idrop 0 1 |; >next 1 1 |; >next ; @@ -118,49 +121,52 @@ nexttop :push >next : for ( start lim -- ) >next 1- >i :| 1 +for? 2 |; >next ; : for+ ( start lim inc -- ) >next >next 1 nextpeek - >i :| 2 nextpeek +for? 3 |; >next ; +: chars ( st -- ) 1- >i :| i 1 else drop 0 then 1 |; >next ; -( Mapping is complex because iterators use the i-stack to store their own - state - when asking for the next value, we must restore the previous value. - However, we do not want to touch the i-stack until the iterator has run, - in case it is an empty iterator with no values. We want to handle this - using a minimum of next-stack space; ideally never more than two slots. - - The user defines a mapping iterator by defining a word or no-name that - passes an anonymous function to "map" and returning. "map" must assume that - the current i value sits below the mapper on the next-stack and - the iterator to remap sits below that. - - "initial-map" assumes a mapper is below it on the stack with no initial - i value, and the iterator to remap sits below that. It queries the iterator - to ensure it's not empty, and then sets up the environment to allow the - mapper to continue working. ) +:asm tail ( TODO: support CREATE words ) + LODSW + MOV BX AX + INC BX INC BX + MOV SI BX + NEXT -: initial-map ( -- f c ) - nextdrop next i >next >next get-next drop drop - next >next ( remove the fake iterator ) - 2 + 1 swap ( add mapper to count and return success ) - else drop drop 0 0 then ; +: gen-save-args ( extra-args... extra-arg-count -- ) + begin dup while swap >next 1- repeat drop ; +: gen-save ( 0 0 extra-args... extra-arg-count -- 1 cnext ) + >r r@ gen-save-args rot drop drop 1 swap ; +: gen-restore ( arg-count -- args... ) + begin dup while i ( cpnext cp: restore i to previous value ) - get-next if ( cpnext cp c ) - >rot i >next i >next 2 + 1 swap - else >rot drop drop 0 swap then ; +: cancel-now cancel iteration drop ; +: _resume ( cpcancel -- c f args... ) + nextdrop 0 0 r rswap ub@ gen-restore ; +: _suspend ( cpresume -- ) + rswap r@ ub@ swap >r gen-save next >next ; -: >map ( mapper -- ) >next ' initial-map >next ; +: GENSTART_ next :| ' noop _resume |; >next ; -: filter ( cp -- f c ) - >r next 1 swap 1+ rdrop return then ( filter hit -- f c ) - drop ( cpnext ) - else ( no more items ) - swap drop 0 swap rdrop return - then again ; +{ var gen-arg-count + :timm (( t:| t, GENSTART_ gen-arg-count @ >t ; + :timm )) t|; t, execute 0 gen-arg-count ! ; + : +arg 1 gen-arg-count !+ ; :timm +arg +arg ; + : -arg -1 gen-arg-count !+ ; :timm -arg -arg ; + :timm >arg t, >next +arg ; + : :yield } create immediate target , startcolon + does> @ w>t gen-arg-count @ >t ; } -: .all each i [ key 0 lit ] + draw-char more ; -: doubled :| ' 2* map |; >map ; +:yield yield0 :| ' noop _resume |; _suspend ; +:yield yield >i :| ' idrop _resume idrop |; _suspend ; +:yield yield> >i :| ' idrop _resume next >i :| :| idrop i cancel-now |; + _resume idrop i |; _suspend 1+ ; +:yield filter if :| ' cancel-now _resume |; _suspend else r then ; + +: . i [ key 0 lit ] + draw-char ; +: .all each i . next ; +: .first each i . break i . next ; +: multiple-of >arg (( each dup i swap % not filter next drop )) ; +: increased >arg (( each dup i + map next drop )) ; +: even+ 2 multiple-of increased ; diff --git a/swine.com b/swine.com index 1c3c249d10e4ad4815049f87810848b0478e6528..311932a1963528e459c413300794bfcf2c4b95be 100755 GIT binary patch delta 3938 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 diff --git a/swine.jrt b/swine.jrt index bbe4b3d..7a961c7 100755 --- a/swine.jrt +++ b/swine.jrt @@ -46,10 +46,10 @@ array board maxw maxh * allot : rand-mine ( -- ) begin rand boardw @ % rand boardh @ % place-mine until ; -: reset-board - board begin dup board-lim < while 0 over b! 1+ repeat drop ; -: populate-board - minecount @ begin rand-mine 1- dup not until drop ; +: iterboard board board-lim for ; +: reset-board iterboard each 0 i b! next ; +: populate-board minecount @ times each rand-mine next ; + : mine? ( p -- f ) b@ FMINE & ; : flag? ( p -- f ) b@ FFLAG & ; : revealed? ( p -- f ) b@ FREVEALED & ; @@ -75,9 +75,7 @@ var neighbour-check ' count-neighbour do-neighbour-squares neighbour-count @ ; : analyze-pos ( x y -- n ) ' mine? count-neighbours ; -: analyze-board - board begin dup board-lim < while - dup square-pos analyze-pos over b@ | over b! 1+ repeat drop ; +: analyze-board iterboard each i square-pos analyze-pos i b!| next ; : count-surrounding-flags ( x y -- n ) ' flag? count-neighbours ; @@ -85,7 +83,7 @@ var neighbour-check reset-board populate-board analyze-board ; : lose LOST game-state b! - board begin dup board-lim < while FREVEALED over b!| 1+ repeat drop ; + iterboard each FREVEALED i b!| next ; : reveal ( p -- ) dup flag? not if dup mine? if lose then FREVEALED swap b!| @@ -95,21 +93,19 @@ var neighbour-check : backtrack-square ( p -- p ) boardw @ - 1- dup board < if drop board then ; : backtrack? ( p -- f ) dup revealed? over 1+ revealed? and swap 2 + revealed? and not ; -: autoreveal-backtrack ( p -- p ) - dup visibly-empty? over backtrack-square backtrack? and - if backtrack-square 1- then ; +: autoreveal-backtrack ( -- ) + i visibly-empty? over backtrack-square backtrack? and + if backtrack-square 1- idrop >i then ; : autoreveal ( -- ) - board begin dup board-lim < while - dup revealed? not if - dup square-pos ' visibly-empty? count-neighbours - if dup reveal autoreveal-backtrack then then - 1+ repeat drop ; + iterboard each i revealed? not if + i square-pos ' visibly-empty? count-neighbours + if i reveal autoreveal-backtrack then + then next ; : check-win ( -- ) - in-progress? if - 0 board begin dup board-lim < while - dup b@ dup FMINE & swap FREVEALED & or not if swap 1+ swap then - 1+ repeat drop not if WON game-state b! then then ; + in-progress? if 0 iterboard each + i b@ dup FMINE & swap FREVEALED & or not if 1+ break then + next not if WON game-state b! then then ; : reveal-unflagged-neighbours? ( p -- ) dup square-pos count-surrounding-flags over squarecount = @@ -167,7 +163,7 @@ dbg" board drawing" : next-row ( -- ) nextline boardx! ; : draw-border ( end mid -- ) - boardw @ begin .- 1- dup while over execute repeat drop drop execute next-row ; + boardw @ times each .- dup execute next execute next-row ; : draw-board-top tl ' tr ' dT draw-border ; : draw-board-bottom bl ' br ' uT draw-border ; : draw-rowborder rT ' lT ' .+ draw-border ; @@ -190,7 +186,7 @@ dbg" general-purpose drawing" : spacer ( st -- ) sp drawdot? if dot else sp then sp ; : draw-spaced-text ( st -- ) - begin dup b@ dup while draw-char dup spacer 1+ repeat drop drop ; + chars each i b@ draw-char i spacer next ; ( menu subsystem ) dbg" menu" @@ -214,9 +210,9 @@ var current-menu : draw-option ( iopt -- ) white fg! menu-option @ draw-text ; : draw-menu 30 9 textxy! - textx 0 begin dup menu-size < while - dup draw-selection dup draw-option 1+ nextline over textx! repeat - drop drop ; + textx 0 menu-size for each + i draw-selection i draw-option nextline dup textx! + next ; : await-menu wait-key key>scan diff --git a/zipoff.com b/zipoff.com index f66d5cf6d2edd0e54e6a304a966214a735fcb36c..c67968a8654740690794a2445046c4894e380882 100755 GIT binary patch literal 20160 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 literal 18756 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 ] ; -:timm :| t, INLINEDATA_ patchpt startcolon ; -:timm |; t, return patch!t ; +: t:| t, INLINEDATA_ patchpt startcolon ; +: t|; t, return patch!t ; +:timm :| t:| ; +:timm |; t|; ; :noname DEF startcolon ; :timm : [ dup , ] ; :timm :t [ , ] ; diff --git a/zipstub.seg b/zipstub.seg index 2ecde3c368dba1eb1c2cc4631a2872c5ac624cab..36ac2204f410d50a59989c5bd713318d313da3b7 100755 GIT binary patch literal 4288 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 e{`?V)LV`HvJEqN1$b;v!Dz;He!y!IQ*XKe delta 1880 zcmZ8heQZ-z6o2R5_jO+%6)-S9ly#ZHoH#ebMo?DPEz>|!G8jtf9LcI7e#E44XfP^` z5(yoI#FS={AQVkZWJ;D=am>L6V{~)WGRKEs69m$^zf`6jicrtJuU!UdUe7td^EHA5B#kon25pOo$FK>uJ*7rdxXbbnreh{9zFGS^Kfi5|MYJW(psh4&M zJ)V_O-OAiEB~uA?l`!`)kUEML&u(?0(z5WlywmxTeDtg~-Zt5&4_r!whUo(3B;kwY zqD~RjD+`nZq?xo(moh>FoWOxvB?sk@sd2p$Ae?0t`QcL~IKFXe2h>@ke5UtomfOZA zG7n=*K?H)oh@LLo*(|5FZBuI$g4sZ3(O-&Z!_|3riw*q>_8MhqEW59{>KSA??q;>U z6W=ebeCd*4y28_A zYMxkbSUs1GxwXV8iZ_!(lq1_AU;FX=g#m86JHGmw+n#g7{oMX={8$&au`iDt<+k^9 z{0z4zl4rl+HgIz2yFu>seSh&=AJi&oDAQVjNI{ZOmuX?8Ni6M}#8zs&HGZVZ#hD3{ zCM5})<|6z!X(C&zloLxMjrS!AziVMKhMNFH9ny7$`(ee6m3`Ha(Bcq>_2O(E#4#y) zx7G)meo#npfj6`?UJ2e3kO}R5#0&M<%*5Air+PpS_7442 z`ty#_vzJP5l%5JAVlhwXWj%>`Yekh0y7dor{<<#evE^k0-b8^#O6jr6cD%pY@NYe| zLVqaWU@>PyqCk``W@SBP1F`A`Bu$<-7mKZE@NP&H1l39=(0UfDx)Z5{jP(s^giXv& zR=-LXn{SNJLVWn55hyYIP#5}u z6+V-1MCf4#q?hIy6*LOFj73H>>4Vpi;lrw27DyrbPI@15+OwQJf^(Qfncv7WRvR-6 zAC!`)(Qkxi8YLU|GB?UvFEa@|x=vmAaN*rXIdPNIhFi$aK+(lE?vKzpax?iza1V)p ztTJ4rSS&TbTA|07Zu7%BTj;WV7J1ngny|YAyKFBa<^!&|%eEGkMyQ)`r4c%SDtm1% z#5t!3PiPS=mq6B~f9pzis@H5)B|-duP?I)m?T(bgb2I6=S&}LF%{JX^uSnH+QdK)H zr>ew+eQ?DV!K*mLlEQOh-$iCT0DSQ$jaJCy+s%~ixM(JV=Qxw$@h2ERYqlTZV$~>C zeXYr)sU{)0+3dKqq;sa!FfneO$@k1_O%ME+&GIb)@tS;y4l@mI{FbL7Op?Hl(H?U> z;rD6PHj_7y2CwNbE&rhIH5