home: hub: 9ficl

ref: e5f0c0798b44ffaa03772477138ff0ae4df4763b
dir: /softwords/jhlocal.fr/

View raw version
\ #if FICL_WANT_LOCALS
\ ** ficl/softwords/jhlocal.fr
\ ** stack comment style local syntax...
\ { a b c | cleared -- d e }
\ variables before the "|" are initialized in reverse order
\ from the stack. Those after the "|" are zero initialized.
\ Anything between "--" and "}" is treated as comment
\ Uses locals...
\ locstate: 0 = looking for | or -- or }}
\           1 = found |
\           2 = found --
hide
0 constant zero

: ?--   ( c-addr u -- c-addr u flag )
    2dup s" --" compare 0= ;
: ?}    ( c-addr u -- c-addr u flag )
    2dup s" }"  compare 0= ;
: ?|    ( c-addr u -- c-addr u flag )
    2dup s" |"  compare 0= ;

: ?delim   ( c-addr u -- state | c-addr u 0 )
    ?| if 
        2drop 1
    else 
        ?-- if 
            2drop 2
        else 
            ?} if 2drop 3  else 0  endif
        endif
    endif
;

set-current

: {
    0 dup locals| locstate |
    
    \ stack locals until we hit a delimiter
    begin
        parse-word      \ ( nLocals c-addr u )
        ?delim dup to locstate
    0= while
        rot 1+          \ ( c-addr u ... c-addr u nLocals )
    repeat

    \ now unstack the locals
    0 do (local) loop   \ ( )

    \ zero locals until -- or }
    locstate 1 = if
        begin
            parse-word
            ?delim dup to locstate
        0= while
            postpone zero  (local)
        repeat
    endif

    0 0 (local)

    \ toss words until }
    locstate 2 = if
        begin
            parse-word
            ?delim dup to locstate
        0= while
            2drop
        repeat
    endif

    locstate 3 <> abort" syntax error in { } local line"
; immediate compile-only

previous 
\ #endif