0,0 → 1,324 |
( 28.Mar.2000 Andrey Cherezov Copyright [C] RU FIG |
|
Èñïîëüçîâàíû èäåè ñëåäóþùèõ àâòîðîâ: |
Ruvim Pinka; Dmitry Yakimov; Oleg Shalyopa; Yuriy Zhilovets; |
Konstantin Tarasov; Michail Maximov. |
|
!! Ðàáîòàåò òîëüêî â SPF4. |
) |
|
( Ïðîñòîå ðàñøèðåíèå ÑÏ-Ôîðòà ëîêàëüíûìè ïåðåìåííûìè. |
Ðåàëèçîâàíî áåç èñïîëüçîâàíèÿ LOCALS ñòàíäàðòà 94. |
|
Îáúÿâëåíèå âðåìåííûõ ïåðåìåííûõ, âèäèìûõ òîëüêî âíóòðè |
òåêóùåãî ñëîâà è îãðàíè÷åííûõ âðåìåíåì âûçîâà äàííîãî |
ñëîâà âûïîëíÿåòñÿ ñ ïîìîùüþ ñëîâà "{". Âíóòðè îïðåäåëåíèÿ |
ñëîâà èñïîëüçóåòñÿ êîíñòðóêöèÿ, ïîäîáíàÿ ñòåêîâîé íîòàöèè Ôîðòà |
{ ñïèñîê_èíèöèàëèçèðîâàííûõ_ëîêàëîâ \ ñï.íåèíèö.ëîêàëîâ -- ÷òî óãîäíî } |
Íàïðèìåð: |
|
{ a b c d \ e f -- i j } |
|
Èëè { a b c d \ e f[ EVALUATE_âûðàæåíèå ] -- i j } |
Ýòî çíà÷èò ÷òî äëÿ ïåðåìåííîé f[ áóäåò âûäåëåí íà ñòåêå âîçâðàòîâ ó÷àñòîê |
ïàìÿòè äëèíîé n áàéò. Èñïîëüçîâàíèå ïåðåìåííîé f[ äàñò àäðåñ íà÷àëà ýòîãî |
ó÷àñòêà. \ ñòèëå MPE\ |
|
Èëè { a b c d \ e [ 12 ] f -- i j } |
Ýòî çíà÷èò ÷òî äëÿ ïåðåìåííîé f áóäåò âûäåëåí íà ñòåêå âîçâðàòîâ ó÷àñòîê |
ïàìÿòè äëèíîé 12 áàéò. Èñïîëüçîâàíèå ïåðåìåííîé f äàñò àäðåñ íà÷àëà ýòîãî |
ó÷àñòêà. |
|
×àñòü "\ ñï.íåèíèö.ëîêàëîâ" ìîæåò îòñóòñòâîâàòü, íàïðèìåð: |
|
{ item1 item2 -- } |
|
Ýòî çàñòàâëÿåò ÑÏ-Ôîðò àâòîìàòè÷åñêè âûäåëÿòü ìåñòî â |
ñòåêå âîçâðàòîâ äëÿ ýòèõ ïåðåìåííûõ â ìîìåíò âûçîâà ñëîâà |
è àâòîìàòè÷åñêè îñâîáîæäàòü ìåñòî ïðè âûõîäå èç íåãî. |
|
Îáðàùåíèå ê òàêèì ëîêàëüíûì ïåðåìåííûì - êàê ê VALUE-ïåðåìåííûì |
ïî èìåíè. Åñëè íóæåí àäðåñ ïåðåìåííîé, òî èñïîëüçóåòñÿ "^ èìÿ" |
èëè "AT èìÿ". |
|
|
Âìåñòî \ ìîæíî èñïîëüçîâàòü | |
Âìåñòî -> ìîæíî èñïîëüçîâàòü TO |
|
Ïðèìåðû: |
|
: TEST { a b c d \ e f -- } a . b . c . b c + -> e e . f . ^ a @ . ; |
Ok |
1 2 3 4 TEST |
1 2 3 5 0 1 Ok |
|
: TEST { a b -- } a . b . CR 5 0 DO I . a . b . CR LOOP ; |
Ok |
12 34 TEST |
12 34 |
0 12 34 |
1 12 34 |
2 12 34 |
3 12 34 |
4 12 34 |
Ok |
|
: TEST { a b } a . b . ; |
Ok |
1 2 TEST |
1 2 Ok |
|
: TEST { a b \ c } a . b . c . ; |
Ok |
1 2 TEST |
1 2 0 Ok |
|
: TEST { a b -- } a . b . ; |
Ok |
1 2 TEST |
1 2 Ok |
|
: TEST { a b \ c -- d } a . b . c . ; |
Ok |
1 2 TEST |
1 2 0 Ok |
|
: TEST { \ a b } a . b . 1 -> a 2 -> b a . b . ; |
Ok |
TEST |
0 0 1 2 Ok |
|
Èìåíà ëîêàëüíûõ ïåðåìåííûõ ñóùåñòâóþò â äèíàìè÷åñêîì |
âðåìåííîì ñëîâàðå òîëüêî â ìîìåíò êîìïèëÿöèè ñëîâà, à |
ïîñëå ýòîãî âû÷èùàþòñÿ è áîëåå íåäîñòóïíû. |
|
Èñïîëüçîâàòü êîíñòðóêöèþ "{ ... }" âíóòðè îäíîãî îïðåäåëåíèÿ ìîæíî |
òîëüêî îäèí ðàç. |
|
Êîìïèëÿöèÿ ýòîé áèáëèîòåêè äîáàâëÿåò â òåêóùèé ñëîâàðü êîìïèëÿöèè |
Òîëüêî äâà ñëîâà: |
ñëîâàðü "vocLocalsSupport" è "{" |
Âñå îñòàëüíûå äåòàëè "ñïðÿòàíû" â ñëîâàðå, èñïîëüçîâàòü èõ |
íå ðåêîìåíäóåòñÿ. |
) |
|
MODULE: vocLocalsSupport |
|
USER widLocals |
USER uLocalsCnt |
USER uLocalsUCnt |
USER uPrevCurrent |
USER uAddDepth |
|
: (Local^) ( N -- ADDR ) |
RP@ + |
; |
: LocalOffs ( n -- offs ) |
uLocalsCnt @ SWAP - CELLS CELL+ uAddDepth @ + |
; |
|
BASE @ HEX |
: CompileLocalsInit |
uPrevCurrent @ SET-CURRENT |
uLocalsCnt @ uLocalsUCnt @ - ?DUP IF CELLS LIT, POSTPONE DRMOVE THEN |
uLocalsUCnt @ ?DUP |
IF |
LIT, POSTPONE (RALLOT) |
THEN |
uLocalsCnt @ ?DUP |
IF CELLS RLIT, ['] (LocalsExit) RLIT, THEN |
; |
|
: CompileLocal@ ( n -- ) |
['] DUP MACRO, |
LocalOffs DUP SHORT? |
OPT_INIT SetOP |
IF 8B B, 44 B, 24 B, B, \ mov eax, offset [esp] |
ELSE 8B B, 84 B, 24 B, , \ mov eax, offset [esp] |
THEN OPT |
OPT_CLOSE |
; |
|
\ : CompileLocal@ ( n -- ) |
\ LocalOffs LIT, POSTPONE RP+@ |
\ ; |
|
: CompileLocal! ( n -- ) |
LocalOffs DUP SHORT? |
OPT_INIT SetOP |
IF 89 B, 44 B, 24 B, B, \ mov offset [esp], eax |
ELSE 89 B, 84 B, 24 B, , \ mov offset [esp], eax |
THEN OPT |
OPT_CLOSE |
['] DROP MACRO, |
; |
|
: CompileLocalRec ( u -- ) |
LocalOffs DUP |
['] DUP MACRO, |
SHORT? |
OPT_INIT SetOP |
IF 8D B, 44 B, 24 B, B, \ lea eax, offset [esp] |
ELSE 8D B, 84 B, 24 B, , \ lea eax, offset [esp] |
THEN OPT |
OPT_CLOSE |
; |
|
BASE ! |
|
: LocalsStartup |
TEMP-WORDLIST widLocals ! |
GET-CURRENT uPrevCurrent ! |
ALSO vocLocalsSupport |
ALSO widLocals @ CONTEXT ! DEFINITIONS |
uLocalsCnt 0! |
uLocalsUCnt 0! |
uAddDepth 0! |
; |
: LocalsCleanup |
PREVIOUS PREVIOUS |
widLocals @ FREE-WORDLIST |
; |
|
: ProcessLocRec ( "name" -- u ) |
[CHAR] ] PARSE |
STATE 0! |
EVALUATE CELL 1- + CELL / \ äåëàåì êðàòíûì 4 |
-1 STATE ! |
DUP uLocalsCnt +! |
uLocalsCnt @ 1- |
; |
|
: CreateLocArray |
ProcessLocRec |
CREATE , |
; |
|
: LocalsRecDoes@ ( -- u ) |
DOES> @ CompileLocalRec |
; |
|
: LocalsRecDoes@2 ( -- u ) |
ProcessLocRec , |
DOES> @ CompileLocalRec |
; |
|
: LocalsDoes@ |
uLocalsCnt @ , |
uLocalsCnt 1+! |
DOES> @ CompileLocal@ |
; |
|
: ;; POSTPONE ; ; IMMEDIATE |
|
|
: ^ |
' >BODY @ |
CompileLocalRec |
; IMMEDIATE |
|
|
: -> ' >BODY @ CompileLocal! ; IMMEDIATE |
|
WARNING DUP @ SWAP 0! |
|
: AT |
[COMPILE] ^ |
; IMMEDIATE |
|
: TO ( "name" -- ) |
>IN @ NextWord widLocals @ SEARCH-WORDLIST 1 = |
IF >BODY @ CompileLocal! DROP |
ELSE >IN ! [COMPILE] TO |
THEN |
; IMMEDIATE |
|
WARNING ! |
|
: â POSTPONE -> ; IMMEDIATE |
|
WARNING @ WARNING 0! |
\ === |
\ ïåðåîïðåäåëåíèå ñîîòâåòñòâóþùèõ ñëîâ äëÿ âîçìîæíîñòè èñïîëüçîâàòü |
\ âðåìåííûå ïåðåìåííûå âíóòðè öèêëà DO LOOP è íåçàâèñèìî îò èçìåíåíèÿ |
\ ñîäåðæèìîãî ñòåêà âîçâðàòîâ ñëîâàìè >R R> |
|
: DO POSTPONE DO [ 3 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: ?DO POSTPONE ?DO [ 3 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: LOOP POSTPONE LOOP [ -3 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: +LOOP POSTPONE +LOOP [ -3 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: >R POSTPONE >R [ 1 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: R> POSTPONE R> [ -1 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: RDROP POSTPONE RDROP [ -1 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: 2>R POSTPONE 2>R [ 2 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
: 2R> POSTPONE 2R> [ -2 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE |
|
\ === |
|
\ { ... | ... -- _____ } |
: ParseLocals3 |
BEGIN |
PARSE-NAME |
DUP 0= ABORT" Locals bad syntax (3)" |
2DUP S" }" COMPARE 0= IF 2DROP EXIT THEN |
2DROP |
AGAIN |
; |
|
\ { ... | _____ -- ... } |
: ParseLocals2 |
BEGIN |
PARSE-NAME |
DUP 0= ABORT" Locals bad syntax (2)" |
2DUP S" --" COMPARE 0= IF 2DROP ParseLocals3 EXIT THEN |
2DUP S" }" COMPARE 0= IF 2DROP EXIT THEN |
2DUP S" [" COMPARE 0= |
IF |
2DROP CreateLocArray LocalsRecDoes@ |
ELSE |
CREATED |
LATEST DUP C@ CHARS + C@ |
[CHAR] [ = |
IF |
LocalsRecDoes@2 |
ELSE |
LocalsDoes@ 1 |
THEN |
THEN |
uLocalsUCnt +! IMMEDIATE |
AGAIN |
; |
|
\ { _____ | ... -- ... } |
: ParseLocals1 |
BEGIN |
PARSE-NAME |
DUP 0= ABORT" Locals bad syntax (1)" |
2DUP S" |" COMPARE 0= IF 2DROP ParseLocals2 EXIT THEN |
2DUP S" \" COMPARE 0= IF 2DROP ParseLocals2 EXIT THEN |
2DUP S" --" COMPARE 0= IF 2DROP ParseLocals3 EXIT THEN |
2DUP S" }" COMPARE 0= IF 2DROP EXIT THEN |
|
CREATED LocalsDoes@ IMMEDIATE |
AGAIN ; |
|
\ uLocalsCnt @ ?DUP |
\ IF CELLS RLIT, ['] (LocalsExit) RLIT, THEN |
|
: ; LocalsCleanup |
S" ;" EVAL-WORD |
; IMMEDIATE |
|
WARNING ! |
|
\ ===================================================================== |
|
EXPORT |
|
: { |
LocalsStartup |
ParseLocals1 |
CompileLocalsInit |
;; IMMEDIATE |
|
;MODULE |