(LOCAL)
=> "[ANS] FORTH"
(no description)
primitive code = [p4_paren_local]
LOCALS|
( xN ... x2 x1 [name1 .. nameN <|>] -- )
=> "[ANS] FORTH"
create local identifiers to be used in the current definition.
At runtime, each identifier will be assigned a value from
the parameter stack.
The identifiers may be treated as if being a VALUE
, it does
also implement the ansi TO
extensions for locals. Note that
the identifiers are only valid inside the currently compiled
word, the SEE
decompiled word will show them as
<A>
<B>
... <N>
a.s.o.
see also LVALUE
compiling word = [p4_locals_bar]
LVALUE
( value [name] -- )
=> "EXTENSIONS"
declares a single local VALUE
using (LOCAL)
- a
sequence of LVALUE
declarations can replace a
LOCALS|
argument, ie. LOCALS| a b c |
is the same as LVALUE a LVALUE b LVALUE c
.
This should also clarify the runtime stack behaviour of
LOCALS|
where the stack parameters seem to be
assigned in reverse order as opposed to their textual
identifier declarations.
compare with VALUE
and the pfe's convenience word
VAR
.
: LVALUE
STATE @ IF
VALUE
ELSE
BL WORD COUNT DUP (LOCAL) (TO)
THEN
; IMMEDIATE
compiling word = [p4_local_value]
LBUFFER:
( size [name] -- )
=> "EXTENSIONS"
declares a single local VALUE
using (LOCAL)
- which
will hold the address of an area like BUFFER:
but carved
from the return-stack (as in C with alloca). This local buffer
will be automatically given up at the end of the word. The
return-stack-pointer will be increased only at the time of
this function (and the address assigned to the LVALUE
)
so that the provided size gets determined at runtime. Note
that in some configurations the forth-return-stack area is
quite small - for large string operations you should consider
to use a POCKET-PAD
in pfe.
: LBUFFER:
STATE @ IF
BUFFER:
ELSE
:NONAME ( size -- rp* ) R> RP@ - DUP RP! SWAP >R ;NONAME
COMPILE, POSTPONE LVALUE
THEN
; IMMEDIATE
compiling word = [p4_local_buffer_var]