mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Forth
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Forth
		
	
	
	
	
	
\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff
 | 
						|
 | 
						|
( Tools words. )
 | 
						|
 | 
						|
: .s ( -- )
 | 
						|
    [char] < emit  depth (.)  ." > "
 | 
						|
    'SP @ >r r@ depth 1- cells +
 | 
						|
    begin
 | 
						|
	dup r@ <>
 | 
						|
    while
 | 
						|
	dup @ .
 | 
						|
	/cell -
 | 
						|
    repeat r> 2drop ;
 | 
						|
 | 
						|
: ?   @ . ;
 | 
						|
 | 
						|
: c?   c@ . ;
 | 
						|
 | 
						|
: dump   bounds do i ? /cell +loop cr ;
 | 
						|
 | 
						|
: cdump   bounds do i c? loop cr ;
 | 
						|
 | 
						|
: again   postpone branch , ; immediate
 | 
						|
 | 
						|
: see-find ( caddr -- end xt )
 | 
						|
    >r here lastxt @
 | 
						|
    begin
 | 
						|
	dup 0= abort" Undefined word"
 | 
						|
	dup r@ word= if r> drop exit then
 | 
						|
	nip dup >nextxt
 | 
						|
    again ;
 | 
						|
 | 
						|
: cabs ( char -- |char| )   dup 127 > if 256 swap - then ;
 | 
						|
 | 
						|
: xt. ( xt -- )
 | 
						|
    ( >name ) count cabs type ;
 | 
						|
 | 
						|
: xt? ( xt -- flag )
 | 
						|
    >r lastxt @ begin
 | 
						|
	?dup
 | 
						|
    while
 | 
						|
	dup r@ = if r> 2drop -1 exit then
 | 
						|
	>nextxt
 | 
						|
    repeat r> drop 0 ;
 | 
						|
 | 
						|
: disassemble ( x -- )
 | 
						|
    dup xt? if
 | 
						|
        ( >name ) count
 | 
						|
        dup 127 > if ." postpone " then
 | 
						|
        cabs type
 | 
						|
    else
 | 
						|
        .
 | 
						|
    then ;
 | 
						|
 | 
						|
: .addr  dup . ;
 | 
						|
 | 
						|
: see-line ( addr -- )
 | 
						|
    cr ."     ( " .addr ." ) "  @ disassemble ;
 | 
						|
 | 
						|
: see-word ( end xt -- )
 | 
						|
    >r ." : " r@ xt.
 | 
						|
    r@ >body do i see-line /cell +loop
 | 
						|
    ."  ;" r> c@ 127 > if ."  immediate" then ;
 | 
						|
 | 
						|
: see   bl word see-find see-word cr ;
 | 
						|
 | 
						|
: #body   bl word see-find >body - ;
 | 
						|
 | 
						|
: type-word ( end xt -- flag )
 | 
						|
    xt. space drop 0 ;
 | 
						|
 | 
						|
: traverse-dictionary ( in.. xt -- out.. )
 | 
						|
    \ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true )
 | 
						|
    >r  here lastxt @  begin
 | 
						|
	?dup
 | 
						|
    while
 | 
						|
	r> 2dup >r >r execute
 | 
						|
	if r> r> 2drop exit then
 | 
						|
	r> dup >nextxt
 | 
						|
    repeat r> 2drop ;
 | 
						|
 | 
						|
: words ( -- )
 | 
						|
    ['] type-word traverse-dictionary cr ;
 | 
						|
 | 
						|
\ ----------------------------------------------------------------------
 | 
						|
 | 
						|
( Tools extension words. )
 | 
						|
 | 
						|
\ ;code
 | 
						|
 | 
						|
\ assembler
 | 
						|
 | 
						|
\ in kernel: bye
 | 
						|
 | 
						|
\ code
 | 
						|
 | 
						|
\ cs-pick
 | 
						|
 | 
						|
\ cs-roll
 | 
						|
 | 
						|
\ editor
 | 
						|
 | 
						|
: forget   ' dup >nextxt lastxt !  'here !  reveal ;
 | 
						|
 | 
						|
\ Kernel: state
 | 
						|
 | 
						|
\ [else]
 | 
						|
 | 
						|
\ [if]
 | 
						|
 | 
						|
\ [then]
 | 
						|
 | 
						|
\ ----------------------------------------------------------------------
 | 
						|
 | 
						|
( Forth2012 tools extension words. )
 | 
						|
 | 
						|
\ TODO: n>r
 | 
						|
 | 
						|
\ TODO: nr>
 | 
						|
 | 
						|
\ TODO: synonym
 | 
						|
 | 
						|
: [undefined]   bl-word find nip 0= ; immediate
 | 
						|
 | 
						|
: [defined]   postpone [undefined] invert ; immediate
 | 
						|
 | 
						|
\ ----------------------------------------------------------------------
 | 
						|
 | 
						|
: @+ ( addr -- addr+/cell x )   dup cell+ swap @ ;
 | 
						|
 | 
						|
: !+ ( x addr -- addr+/cell )   tuck ! cell+ ;
 | 
						|
 | 
						|
: -rot   swap >r swap r> ;
 |