mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
More Forth samples.
This commit is contained in:
79
samples/Forth/KataDiversion.fth
Normal file
79
samples/Forth/KataDiversion.fth
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
\ KataDiversion in Forth
|
||||||
|
|
||||||
|
\ -- utils
|
||||||
|
|
||||||
|
\ empty the stack
|
||||||
|
: EMPTY
|
||||||
|
DEPTH 0 <> IF BEGIN
|
||||||
|
DROP DEPTH 0 =
|
||||||
|
UNTIL
|
||||||
|
THEN ;
|
||||||
|
|
||||||
|
\ power
|
||||||
|
: ** ( n1 n2 -- n1_pow_n2 ) 1 SWAP ?DUP IF 0 DO OVER * LOOP THEN NIP ;
|
||||||
|
|
||||||
|
\ compute the highest power of 2 below N.
|
||||||
|
\ e.g. : 31 -> 16, 4 -> 4
|
||||||
|
: MAXPOW2 ( n -- log2_n ) DUP 1 < IF 1 ABORT" Maxpow2 need a positive value."
|
||||||
|
ELSE DUP 1 = IF 1
|
||||||
|
ELSE
|
||||||
|
1 >R
|
||||||
|
BEGIN ( n |R: i=1)
|
||||||
|
DUP DUP I - 2 *
|
||||||
|
( n n 2*[n-i])
|
||||||
|
R> 2 * >R ( … |R: i*2)
|
||||||
|
> ( n n>2*[n-i] )
|
||||||
|
UNTIL
|
||||||
|
R> 2 /
|
||||||
|
THEN
|
||||||
|
THEN NIP ;
|
||||||
|
|
||||||
|
\ -- kata
|
||||||
|
|
||||||
|
\ test if the given N has two adjacent 1 bits
|
||||||
|
\ e.g. : 11 -> 1011 -> -1
|
||||||
|
\ 9 -> 1001 -> 0
|
||||||
|
: ?NOT-TWO-ADJACENT-1-BITS ( n -- bool )
|
||||||
|
\ the word uses the following algorithm :
|
||||||
|
\ (stack|return stack)
|
||||||
|
\ ( A N | X ) A: 0, X: N LOG2
|
||||||
|
\ loop: if N-X > 0 then A++ else A=0 ; X /= 2
|
||||||
|
\ return 0 if A=2
|
||||||
|
\ if X=1 end loop and return -1
|
||||||
|
0 SWAP DUP DUP 0 <> IF
|
||||||
|
MAXPOW2 >R
|
||||||
|
BEGIN
|
||||||
|
DUP I - 0 >= IF
|
||||||
|
SWAP DUP 1 = IF 1+ SWAP
|
||||||
|
ELSE DROP 1 SWAP I -
|
||||||
|
THEN
|
||||||
|
ELSE NIP 0 SWAP
|
||||||
|
THEN
|
||||||
|
OVER
|
||||||
|
2 =
|
||||||
|
I 1 = OR
|
||||||
|
R> 2 / >R
|
||||||
|
UNTIL
|
||||||
|
R> 2DROP
|
||||||
|
2 <>
|
||||||
|
ELSE 2DROP INVERT
|
||||||
|
THEN ;
|
||||||
|
|
||||||
|
\ return the maximum number which can be made with N (given number) bits
|
||||||
|
: MAX-NB ( n -- m ) DUP 1 < IF DROP 0 ( 0 )
|
||||||
|
ELSE
|
||||||
|
DUP IF DUP 2 SWAP ** NIP 1 - ( 2**n - 1 )
|
||||||
|
THEN
|
||||||
|
THEN ;
|
||||||
|
|
||||||
|
|
||||||
|
\ return the number of numbers which can be made with N (given number) bits
|
||||||
|
\ or less, and which have not two adjacent 1 bits.
|
||||||
|
\ see http://www.codekata.com/2007/01/code_kata_fifte.html
|
||||||
|
: HOW-MANY-NB-NOT-TWO-ADJACENT-1-BITS ( n -- m )
|
||||||
|
DUP 1 < IF DUP 0
|
||||||
|
ELSE
|
||||||
|
0 SWAP
|
||||||
|
MAX-NB 1 + 0 DO I ?NOT-TWO-ADJACENT-1-BITS - LOOP
|
||||||
|
THEN ;
|
||||||
|
|
||||||
42
samples/Forth/block.fth
Normal file
42
samples/Forth/block.fth
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
( Block words. )
|
||||||
|
|
||||||
|
variable blk
|
||||||
|
variable current-block
|
||||||
|
|
||||||
|
: block ( n -- addr )
|
||||||
|
current-block ! 0 ;
|
||||||
|
|
||||||
|
: buffer ( n -- addr )
|
||||||
|
current-block ! 0 ;
|
||||||
|
|
||||||
|
\ evaluate (extended semantics)
|
||||||
|
\ flush ( -- )
|
||||||
|
|
||||||
|
: load ( ... n -- ... )
|
||||||
|
dup current-block !
|
||||||
|
blk !
|
||||||
|
save-input
|
||||||
|
0 >in !
|
||||||
|
blk @ block ''source ! 1024 ''#source !
|
||||||
|
( interpret )
|
||||||
|
restore-input ;
|
||||||
|
|
||||||
|
\ save-buffers ( -- )
|
||||||
|
\ update ( -- )
|
||||||
|
|
||||||
|
( Block extension words. )
|
||||||
|
|
||||||
|
\ empty-buffers ( -- )
|
||||||
|
|
||||||
|
variable scr
|
||||||
|
|
||||||
|
: list ( n -- )
|
||||||
|
dup scr !
|
||||||
|
dup current-block !
|
||||||
|
block 1024 bounds do i @ emit loop ;
|
||||||
|
|
||||||
|
\ refill (extended semantics)
|
||||||
|
|
||||||
|
: thru ( x y -- ) +1 swap do i load loop ;
|
||||||
|
|
||||||
|
\ \ (extended semantics)
|
||||||
136
samples/Forth/core-ext.fth
Normal file
136
samples/Forth/core-ext.fth
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff
|
||||||
|
|
||||||
|
\ Kernel: #tib
|
||||||
|
\ TODO: .r
|
||||||
|
|
||||||
|
: .( ( "<string><paren>" -- )
|
||||||
|
[char] ) parse type ; immediate
|
||||||
|
|
||||||
|
: 0<> ( n -- flag ) 0 <> ;
|
||||||
|
|
||||||
|
: 0> ( n -- flag ) 0 > ;
|
||||||
|
|
||||||
|
\ Kernel: 2>r
|
||||||
|
|
||||||
|
: 2r> ( -- x1 x2 ) ( R: x1 x2 -- ) r> r> r> rot >r swap ;
|
||||||
|
|
||||||
|
: 2r@ ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 ) 2r> 2dup 2>r ;
|
||||||
|
|
||||||
|
: :noname align here 0 c, 15 allot lastxt dup @ , !
|
||||||
|
[ ' enter >code @ ] literal , 0 , ] lastxt @ ;
|
||||||
|
|
||||||
|
\ Kernel: <>
|
||||||
|
|
||||||
|
\ : ?do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )
|
||||||
|
\ here postpone 2>r unresolved branch here ;
|
||||||
|
|
||||||
|
: again ( -- ) ( C: dest -- )
|
||||||
|
postpone branch , ; immediate
|
||||||
|
|
||||||
|
: string+ ( caddr -- addr )
|
||||||
|
count + aligned ;
|
||||||
|
|
||||||
|
: (c") ( -- caddr ) ( R: ret1 -- ret2 )
|
||||||
|
r> dup string+ >r ;
|
||||||
|
|
||||||
|
: c" ( "<string><quote>" -- caddr )
|
||||||
|
postpone (c") [char] " parse dup c, string, ; immediate
|
||||||
|
|
||||||
|
: case ( -- ) ( C: -- case-sys )
|
||||||
|
0 ;
|
||||||
|
|
||||||
|
: compile, ( xt -- )
|
||||||
|
, ;
|
||||||
|
|
||||||
|
\ TODO: convert
|
||||||
|
|
||||||
|
: endcase ( x -- ) ( C: case-sys -- )
|
||||||
|
0 do postpone then loop
|
||||||
|
postpone drop ;
|
||||||
|
|
||||||
|
: endof ( -- ) ( C: case-sys1 of-sys -- case-sys2 )
|
||||||
|
postpone else swap 1+ ;
|
||||||
|
|
||||||
|
\ TODO: erase
|
||||||
|
\ TODO: expect
|
||||||
|
|
||||||
|
: false ( -- 0 )
|
||||||
|
0 ;
|
||||||
|
|
||||||
|
: hex ( -- )
|
||||||
|
16 base ! ;
|
||||||
|
|
||||||
|
\ TODO: marker
|
||||||
|
\ Kernel: nip
|
||||||
|
|
||||||
|
: of ( x x -- | x y -- x ) ( C: -- of-sys )
|
||||||
|
postpone over postpone = postpone if postpone drop ;
|
||||||
|
|
||||||
|
\ Kernel: pad
|
||||||
|
\ Kernel: parse
|
||||||
|
|
||||||
|
: pick ( xn ... x0 n -- xn ... x0 xn )
|
||||||
|
2 + cells 'SP @ + @ ;
|
||||||
|
|
||||||
|
: query ( -- )
|
||||||
|
tib ''source ! #tib ''#source ! 0 'source-id !
|
||||||
|
refill drop ;
|
||||||
|
|
||||||
|
\ Kernel: refill
|
||||||
|
\ Kernel: restore-input
|
||||||
|
|
||||||
|
\ TODO: roll ( xn xn-1 ... x0 n -- xn-1 ... x0 xn ) ;
|
||||||
|
|
||||||
|
\ Kernel: save-input
|
||||||
|
\ Kernel: source-id
|
||||||
|
\ TODO: span
|
||||||
|
\ Kernel: tib
|
||||||
|
|
||||||
|
: to ( x "word" -- )
|
||||||
|
' >body , ;
|
||||||
|
|
||||||
|
: true ( -- -1 )
|
||||||
|
-1 ;
|
||||||
|
|
||||||
|
: tuck ( x y -- y x y )
|
||||||
|
swap over ;
|
||||||
|
|
||||||
|
\ TODO: u.r
|
||||||
|
|
||||||
|
: u> ( x y -- flag )
|
||||||
|
2dup u< if 2drop false else <> then ;
|
||||||
|
|
||||||
|
\ TODO: unused
|
||||||
|
|
||||||
|
: value ( x "word" -- )
|
||||||
|
create ,
|
||||||
|
does> ( -- x )
|
||||||
|
@ ;
|
||||||
|
|
||||||
|
: within over - >r - r> u< ;
|
||||||
|
|
||||||
|
\ TODO: [compile]
|
||||||
|
|
||||||
|
\ Kernel: \
|
||||||
|
|
||||||
|
\ ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
( Forth2012 core extension words. )
|
||||||
|
|
||||||
|
\ TODO: action-of
|
||||||
|
|
||||||
|
\ TODO: buffer:
|
||||||
|
|
||||||
|
: defer create ['] abort , does> @ execute ;
|
||||||
|
|
||||||
|
: defer! ( xt2 xt1 -- ) >body ! ;
|
||||||
|
|
||||||
|
: defer@ ( xt1 -- xt2 ) >body @ ;
|
||||||
|
|
||||||
|
\ TODO: holds
|
||||||
|
|
||||||
|
: is ( xt "word" -- ) ' defer! ;
|
||||||
|
|
||||||
|
\ TODO: parse-name
|
||||||
|
|
||||||
|
\ TODO: s\"
|
||||||
252
samples/Forth/core.fth
Normal file
252
samples/Forth/core.fth
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
|
||||||
133
samples/Forth/tools.fth
Normal file
133
samples/Forth/tools.fth
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
\ -*- 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> ;
|
||||||
Reference in New Issue
Block a user