mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Add FORTRAN and Forth samples.
This commit is contained in:
		
							
								
								
									
										25
									
								
								samples/FORTRAN/sample1.F
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample1.F
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample1.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample1.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample1.for
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample1.for
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample2.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample2.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  |       PROGRAM MAIN | ||||||
|  |  | ||||||
|  |       END | ||||||
|  |  | ||||||
|  | C comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       SUBROUTINE foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       IF( i.NE.0 ) THEN | ||||||
|  |          CALL bar( -i ) | ||||||
|  |       END IF | ||||||
|  |  | ||||||
|  |       RETURN | ||||||
|  |       END | ||||||
|  |  | ||||||
|  |       DOUBLE COMPLEX FUNCTION baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       RETURN  | ||||||
|  |       END | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.F
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.F
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.for
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.for
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
		Reference in New Issue
	
	Block a user