Annotation of gforth/test/postpone.fs, revision 1.1

1.1     ! anton       1: \ checks that postpone works correctly with words with special
        !             2: \ compilation semantics
        !             3: 
        !             4: \ by M. Anton Ertl 1996
        !             5: 
        !             6: \ This file is based on John Hayes' core.fr (coretest.fs), which has
        !             7: \ the following copyright notice:
        !             8: 
        !             9: \ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
        !            10: \ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
        !            11: 
        !            12: \ my contributions to this file are in the public domain
        !            13: 
        !            14: \ you have to load John Hayes' tester.fs (=tester.fr) and coretest.fs
        !            15: \ (core.fr) first
        !            16: 
        !            17: \ These tests are especially useful for showing that state-smart
        !            18: \ implementations of words with special compilation semantics,
        !            19: \ combined with a straight-forward implementation of POSTPONE (and
        !            20: \ [COMPILE]) do not conform to the ANS Forth standard. The essential
        !            21: \ sentences in the standad are:
        !            22: 
        !            23: \ 6.1.2033 POSTPONE CORE
        !            24: \ ...
        !            25: \ Compilation: ( <spaces>name -- ) 
        !            26: 
        !            27: \ Skip leading space delimiters. Parse name delimited by a space. Find
        !            28: \ name. Append the compilation semantics of name to the current
        !            29: \ definition.
        !            30: 
        !            31: \ 6.2.2530 [COMPILE] bracket-compile CORE EXT 
        !            32: \ ...
        !            33: \ Compilation: ( <spaces>name -- ) 
        !            34: 
        !            35: \ Skip leading space delimiters. Parse name delimited by a space. Find
        !            36: \ name. If name has other than default compilation semantics, append
        !            37: \ them to the current definition;...
        !            38: 
        !            39: 
        !            40: \ Note that the compilation semantics are appended, not some
        !            41: \ state-dependent semantics.
        !            42: 
        !            43: \ first I test against a non-ANS solution suggested by Bernd Paysan
        !            44: 
        !            45: : state@-now ( -- f )
        !            46:     state @ ; immediate
        !            47: 
        !            48: : state@ ( -- f )
        !            49:     POSTPONE state@-now ;
        !            50: 
        !            51: { state@ -> state @ }
        !            52: 
        !            53: \ here I test POSTPONE with all core words with special compilation
        !            54: \ semantics.
        !            55: 
        !            56: testing postpone (
        !            57: 
        !            58: : postpone-(
        !            59:     postpone ( ;
        !            60: 
        !            61: { : pp1 [ postpone-( does nothing ) ] ; -> }
        !            62: { here pp1 -> here }
        !            63: 
        !            64: testing postpone +loop
        !            65: 
        !            66: : postpone-+loop
        !            67:     postpone +loop ;
        !            68: 
        !            69: { : PGD2 DO I -1 [ POSTPONE-+LOOP ] ; -> }
        !            70: { 1 4 PGD2 -> 4 3 2 1 }
        !            71: { -1 2 PGD2 -> 2 1 0 -1 }
        !            72: { MID-UINT MID-UINT+1 PGD2 -> MID-UINT+1 MID-UINT }
        !            73: 
        !            74: { : PGD4 DO 1 0 DO J LOOP -1 [ POSTPONE-+LOOP ] ; -> }
        !            75: { 1 4 PGD4 -> 4 3 2 1 }
        !            76: { -1 2 PGD4 -> 2 1 0 -1 }
        !            77: { MID-UINT MID-UINT+1 PGD4 -> MID-UINT+1 MID-UINT }
        !            78: 
        !            79: testing postpone ."
        !            80: 
        !            81: : postpone-."
        !            82:     postpone ." ;
        !            83: 
        !            84: : pdq2 [ postpone-." you should see this later. " ] cr ;
        !            85: : pdq1 [ postpone-." you should see this first. " ] cr ;
        !            86: { pdq1 pdq2 -> }
        !            87: 
        !            88: testing postpone ;
        !            89: : postpone-;
        !            90:     postpone ; ;
        !            91: 
        !            92: { : psc [ postpone-; -> }
        !            93: { psc -> }    
        !            94: 
        !            95: testing postpone abort"
        !            96: 
        !            97: : postpone-abort"
        !            98:     postpone abort" ;
        !            99: 
        !           100: { : paq1 [ postpone-abort" this should not abort" ] ; -> }
        !           101: 
        !           102: testing postpone begin
        !           103: : postpone-begin
        !           104:     postpone begin ;
        !           105: 
        !           106: { : PB3 [ POSTPONE-BEGIN ] DUP 5 < WHILE DUP 1+ REPEAT ; -> }
        !           107: { 0 PB3 -> 0 1 2 3 4 5 }
        !           108: { 4 PB3 -> 4 5 }
        !           109: { 5 PB3 -> 5 }
        !           110: { 6 PB3 -> 6 }
        !           111: 
        !           112: { : PB4 [ POSTPONE-BEGIN ] DUP 1+ DUP 5 > UNTIL ; -> }
        !           113: { 3 PB4 -> 3 4 5 6 }
        !           114: { 5 PB4 -> 5 6 }
        !           115: { 6 PB4 -> 6 7 }
        !           116: 
        !           117: { : PB5 [ POSTPONE-BEGIN ] DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }
        !           118: { 1 PB5 -> 1 345 }
        !           119: { 2 PB5 -> 2 345 }
        !           120: { 3 PB5 -> 3 4 5 123 }
        !           121: { 4 PB5 -> 4 5 123 }
        !           122: { 5 PB5 -> 5 123 }
        !           123: 
        !           124: testing postpone do
        !           125: : postpone-do
        !           126:     postpone do ;
        !           127: 
        !           128: { : PDO1 [ POSTPONE-DO ] I LOOP ; -> }
        !           129: { 4 1 PDO1 -> 1 2 3 }
        !           130: { 2 -1 PDO1 -> -1 0 1 }
        !           131: { MID-UINT+1 MID-UINT PDO1 -> MID-UINT }
        !           132: 
        !           133: { : PDO2 [ POSTPONE-DO ] I -1 +LOOP ; -> }
        !           134: { 1 4 PDO2 -> 4 3 2 1 }
        !           135: { -1 2 PDO2 -> 2 1 0 -1 }
        !           136: { MID-UINT MID-UINT+1 PDO2 -> MID-UINT+1 MID-UINT }
        !           137: 
        !           138: { : PDO3 [ POSTPONE-DO ] 1 0 [ POSTPONE-DO ] J LOOP LOOP ; -> }
        !           139: { 4 1 PDO3 -> 1 2 3 }
        !           140: { 2 -1 PDO3 -> -1 0 1 }
        !           141: { MID-UINT+1 MID-UINT PDO3 -> MID-UINT }
        !           142: 
        !           143: { : PDO4 [ POSTPONE-DO ] 1 0 [ POSTPONE-DO ] J LOOP -1 +LOOP ; -> }
        !           144: { 1 4 PDO4 -> 4 3 2 1 }
        !           145: { -1 2 PDO4 -> 2 1 0 -1 }
        !           146: { MID-UINT MID-UINT+1 PDO4 -> MID-UINT+1 MID-UINT }
        !           147: 
        !           148: { : PDO5 123 SWAP 0 [ POSTPONE-DO ] I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }
        !           149: { 1 PDO5 -> 123 }
        !           150: { 5 PDO5 -> 123 }
        !           151: { 6 PDO5 -> 234 }
        !           152: 
        !           153: { : PDO6  ( PAT: {0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} )
        !           154:    0 SWAP 0 [ POSTPONE-DO ]
        !           155:       I 1+ 0 [ POSTPONE-DO ] I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
        !           156:     LOOP ; -> }
        !           157: { 1 PDO6 -> 1 }
        !           158: { 2 PDO6 -> 3 }
        !           159: { 3 PDO6 -> 4 1 2 }
        !           160: 
        !           161: testing postpone does>
        !           162: : postpone-does>
        !           163:     postpone does> ;
        !           164: 
        !           165: { : PDOES1 [ POSTPONE-DOES> ] @ 1 + ; -> }
        !           166: { : PDOES2 [ POSTPONE-DOES> ] @ 2 + ; -> }
        !           167: { CREATE PCR1 -> }
        !           168: { PCR1 -> HERE }
        !           169: { ' PCR1 >BODY -> HERE }
        !           170: { 1 , -> }
        !           171: { PCR1 @ -> 1 }
        !           172: { PDOES1 -> }
        !           173: { PCR1 -> 2 }
        !           174: { PDOES2 -> }
        !           175: { PCR1 -> 3 }
        !           176: 
        !           177: { : pWEIRD: CREATE [ POSTPONE-DOES> ] 1 + [ POSTPONE-DOES> ] 2 + ; -> }
        !           178: { pWEIRD: PW1 -> }
        !           179: { ' PW1 >BODY -> HERE }
        !           180: { PW1 -> HERE 1 + }
        !           181: { PW1 -> HERE 2 + }
        !           182: 
        !           183: testing postpone else
        !           184: : postpone-else
        !           185:     postpone else ;
        !           186: 
        !           187: { : PELSE1 IF 123 [ postpone-ELSE ] 234 THEN ; -> }
        !           188: { 0 PELSE1 -> 234 }
        !           189: { 1 PELSE1 -> 123 }
        !           190: 
        !           191: { : PELSE2 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 [ postpone-ELSE ] 345 THEN ; -> }
        !           192: { 1 PELSE2 -> 1 345 }
        !           193: { 2 PELSE2 -> 2 345 }
        !           194: { 3 PELSE2 -> 3 4 5 123 }
        !           195: { 4 PELSE2 -> 4 5 123 }
        !           196: { 5 PELSE2 -> 5 123 }
        !           197: 
        !           198: testing postpone if
        !           199: : postpone-if
        !           200:     postpone if ;
        !           201: 
        !           202: { : PIF1 [ POSTPONE-IF ] 123 THEN ; -> }
        !           203: { : PIF2 [ POSTPONE-IF ] 123 ELSE 234 THEN ; -> }
        !           204: { 0 PIF1 -> }
        !           205: { 1 PIF1 -> 123 }
        !           206: { -1 PIF1 -> 123 }
        !           207: { 0 PIF2 -> 234 }
        !           208: { 1 PIF2 -> 123 }
        !           209: { -1 PIF1 -> 123 }
        !           210: 
        !           211: { : PIF6 ( N -- 0,1,..N ) DUP [ POSTPONE-IF ] DUP >R 1- RECURSE R> THEN ; -> }
        !           212: { 0 PIF6 -> 0 }
        !           213: { 1 PIF6 -> 0 1 }
        !           214: { 2 PIF6 -> 0 1 2 }
        !           215: { 3 PIF6 -> 0 1 2 3 }
        !           216: { 4 PIF6 -> 0 1 2 3 4 }
        !           217: 
        !           218: testing postpone literal
        !           219: : postpone-literal
        !           220:     postpone literal ;
        !           221: 
        !           222: { : plit [ 42 postpone-literal ] ; -> }
        !           223: { plit -> 42 }
        !           224: 
        !           225: testing postpone loop
        !           226: : postpone-loop
        !           227:     postpone loop ;
        !           228: 
        !           229: { : PLOOP1 DO I [ POSTPONE-LOOP ] ; -> }
        !           230: { 4 1 PLOOP1 -> 1 2 3 }
        !           231: { 2 -1 PLOOP1 -> -1 0 1 }
        !           232: { MID-UINT+1 MID-UINT PLOOP1 -> MID-UINT }
        !           233: 
        !           234: { : PLOOP3 DO 1 0 DO J [ POSTPONE-LOOP ] [ POSTPONE-LOOP ] ; -> }
        !           235: { 4 1 PLOOP3 -> 1 2 3 }
        !           236: { 2 -1 PLOOP3 -> -1 0 1 }
        !           237: { MID-UINT+1 MID-UINT PLOOP3 -> MID-UINT }
        !           238: 
        !           239: { : PLOOP4 DO 1 0 DO J [ POSTPONE-LOOP ] -1 +LOOP ; -> }
        !           240: { 1 4 PLOOP4 -> 4 3 2 1 }
        !           241: { -1 2 PLOOP4 -> 2 1 0 -1 }
        !           242: { MID-UINT MID-UINT+1 PLOOP4 -> MID-UINT+1 MID-UINT }
        !           243: 
        !           244: { : PLOOP5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN [ POSTPONE-LOOP ] ; -> }
        !           245: { 1 PLOOP5 -> 123 }
        !           246: { 5 PLOOP5 -> 123 }
        !           247: { 6 PLOOP5 -> 234 }
        !           248: 
        !           249: { : PLOOP6  ( PAT: {0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} )
        !           250:    0 SWAP 0 DO
        !           251:       I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ [ POSTPONE-LOOP ]
        !           252:     [ POSTPONE-LOOP ] ; -> }
        !           253: { 1 PLOOP6 -> 1 }
        !           254: { 2 PLOOP6 -> 3 }
        !           255: { 3 PLOOP6 -> 4 1 2 }
        !           256: 
        !           257: testing postpone postpone
        !           258: : postpone-postpone
        !           259:     postpone postpone ;
        !           260: 
        !           261: { : PPP1 123 ; -> }
        !           262: { : PPP4 [ POSTPONE-POSTPONE PPP1 ] ; IMMEDIATE -> }
        !           263: { : PPP5 PPP4 ; -> }
        !           264: { PPP5 -> 123 }
        !           265: { : PPP6 345 ; IMMEDIATE -> }
        !           266: { : PPP7 [ POSTPONE-POSTPONE PPP6 ] ; -> }
        !           267: { PPP7 -> 345 }
        !           268: 
        !           269: testing postpone recurse
        !           270: : postpone-recurse
        !           271:     postpone recurse ;
        !           272: 
        !           273: { : GREC ( N -- 0,1,..N ) DUP IF DUP >R 1- [ postpone-RECURSE ] R> THEN ; -> }
        !           274: { 0 GREC -> 0 }
        !           275: { 1 GREC -> 0 1 }
        !           276: { 2 GREC -> 0 1 2 }
        !           277: { 3 GREC -> 0 1 2 3 }
        !           278: { 4 GREC -> 0 1 2 3 4 }
        !           279: 
        !           280: testing postpone repeat
        !           281: : postpone-repeat
        !           282:     postpone repeat ;
        !           283: 
        !           284: { : PREP3 BEGIN DUP 5 < WHILE DUP 1+ [ POSTPONE-REPEAT ] ; -> }
        !           285: { 0 PREP3 -> 0 1 2 3 4 5 }
        !           286: { 4 PREP3 -> 4 5 }
        !           287: { 5 PREP3 -> 5 }
        !           288: { 6 PREP3 -> 6 }
        !           289: 
        !           290: { : PREP5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ [ POSTPONE-REPEAT ] 123 ELSE 345 THEN ; -> }
        !           291: { 1 PREP5 -> 1 345 }
        !           292: { 2 PREP5 -> 2 345 }
        !           293: { 3 PREP5 -> 3 4 5 123 }
        !           294: { 4 PREP5 -> 4 5 123 }
        !           295: { 5 PREP5 -> 5 123 }
        !           296: 
        !           297: testing postpone S"
        !           298: : postpone-s"
        !           299:     postpone s" ;
        !           300: 
        !           301: { : PSQ4 [ postpone-S" XY" ] ; -> }
        !           302: { PSQ4 SWAP DROP -> 2 }
        !           303: { PSQ4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }
        !           304: 
        !           305: testing postpone then
        !           306: : postpone-then
        !           307:     postpone then ;
        !           308: 
        !           309: { : PTH1 IF 123 [ POSTPONE-THEN ] ; -> }
        !           310: { : PTH2 IF 123 ELSE 234 [ POSTPONE-THEN ] ; -> }
        !           311: { 0 PTH1 -> }
        !           312: { 1 PTH1 -> 123 }
        !           313: { -1 PTH1 -> 123 }
        !           314: { 0 PTH2 -> 234 }
        !           315: { 1 PTH2 -> 123 }
        !           316: { -1 PTH1 -> 123 }
        !           317: 
        !           318: { : PTH5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 [ POSTPONE-THEN ] ; -> }
        !           319: { 1 PTH5 -> 1 345 }
        !           320: { 2 PTH5 -> 2 345 }
        !           321: { 3 PTH5 -> 3 4 5 123 }
        !           322: { 4 PTH5 -> 4 5 123 }
        !           323: { 5 PTH5 -> 5 123 }
        !           324: 
        !           325: { : PTH6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> [ POSTPONE-THEN ] ; -> }
        !           326: { 0 PTH6 -> 0 }
        !           327: { 1 PTH6 -> 0 1 }
        !           328: { 2 PTH6 -> 0 1 2 }
        !           329: { 3 PTH6 -> 0 1 2 3 }
        !           330: { 4 PTH6 -> 0 1 2 3 4 }
        !           331: 
        !           332: testing postpone until
        !           333: : postpone-until
        !           334:     postpone until ;
        !           335: 
        !           336: { : PUNT4 BEGIN DUP 1+ DUP 5 > [ postpone-UNTIL ] ; -> }
        !           337: { 3 PUNT4 -> 3 4 5 6 }
        !           338: { 5 PUNT4 -> 5 6 }
        !           339: { 6 PUNT4 -> 6 7 }
        !           340: 
        !           341: testing postpone while
        !           342: : postpone-while
        !           343:     postpone while ;
        !           344: 
        !           345: { : PWH3 BEGIN DUP 5 < [ POSTPONE-WHILE ] DUP 1+ REPEAT ; -> }
        !           346: { 0 PWH3 -> 0 1 2 3 4 5 }
        !           347: { 4 PWH3 -> 4 5 }
        !           348: { 5 PWH3 -> 5 }
        !           349: { 6 PWH3 -> 6 }
        !           350: 
        !           351: { : PWH5 BEGIN DUP 2 > [ POSTPONE-WHILE ] DUP 5 < [ POSTPONE-WHILE ] DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }
        !           352: { 1 PWH5 -> 1 345 }
        !           353: { 2 PWH5 -> 2 345 }
        !           354: { 3 PWH5 -> 3 4 5 123 }
        !           355: { 4 PWH5 -> 4 5 123 }
        !           356: { 5 PWH5 -> 5 123 }
        !           357: 
        !           358: 
        !           359: testing postpone [
        !           360: : postpone-[
        !           361:     postpone [ ;
        !           362: 
        !           363: { here postpone-[ -> here }
        !           364: 
        !           365: testing postpone [']
        !           366: : postpone-[']
        !           367:     postpone ['] ;
        !           368: 
        !           369: { : PTICK1 123 ; -> }
        !           370: { : PTICK2 [ postpone-['] PTICK1 ] ; IMMEDIATE -> }
        !           371: { PTICK2 EXECUTE -> 123 }
        !           372: 
        !           373: testing postpone [char]
        !           374: : postpone-[char]
        !           375:     postpone [char] ;
        !           376: 
        !           377: { : PCHAR1 [ postpone-[CHAR] X ] ; -> }
        !           378: { : PCHAR2 [ postpone-[CHAR] HELLO ] ; -> }
        !           379: { PCHAR1 -> 58 }
        !           380: { PCHAR2 -> 48 }
        !           381: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>