VARIABLES: xyzx 'y' z ' x '' y '' z '' sm ; VARIABLES
: VARIABLE CREATE 0,;
: NOTFOUND (addr u -) CREATED 0,;
VOCABULARY variables
ALSO variables DEFINITIONS
PREVIOUS DEFINITIONS
: VARIABLES: ALSO variables;
VOCABULARY variables ALSO variables DEFINITIONS : NOTFOUND (addr u -) CREATED 0,; :; VARIABLES PREVIOUS; PREVIOUS DEFINITIONS : VARIABLES: ALSO variables;
VOCABULARY values ALSO values DEFINITIONS : NOTFOUND ...
: VALUE
HEADER
['] _CONSTANT-CODE COMPILE,,
['] _TOVALUE-CODE COMPILE,
;
: VALUED (n addr u ---)
SHEADER
['] _CONSTANT-CODE COMPILE,,
['] _TOVALUE-CODE COMPILE,
;
VOCABULARY values ALSO values DEFINITIONS :; VALUES PREVIOUS DROP; : NOTFOUND VALUED 0; PREVIOUS DEFINITIONS : VALUES: ALSO values 0;
VALUES: 11 aa 22 bb 33 cc ; VALUES
VALUES:
aa = 11
bb = 22
cc = 33
; VALUES
VOCABULARY values ALSO values DEFINITIONS :; VALUES PREVIOUS DROP; : = BL WORD? LITERAL LATEST NAME> 9 + EXECUTE; : NOTFOUND VALUED 0; PREVIOUS DEFINITIONS : VALUES: ALSO values 0;
It is valuable because it does not fall out of the paradigm of the language, besides it allows initializing VALUE variables with calculated values.VALUES: 11 TO aa 22 TO bb 33 TO cc ; VALUES
VALUES:
11 TO aa
22 1980 * TO bb
aa bb + TO cc
; VALUES
VOCABULARY values ALSO values DEFINITIONS :; VALUES PREVIOUS; : TO VALUE; PREVIOUS DEFINITIONS : VALUES: ALSO values;
CONSTANTS:
11 IS aa
22 1980 * IS bb
aa bb + is cc
; CONSTANTS
WINAPIS:
LIB: USER32.DLL
Postquitmessage
PostMessageA
SetActiveWindow
LIB: GDI32.DLL
CreateFontA
GetDeviceCaps
DeleteDC
LIB: COMCTL32.DLL
InitCommonControlsEx
; WINAPIS
: __WIN: (params "ProcessName" "LibraryName" -)
HERE> R
0, \ address of winproc
0, \ address of library name
0, \ address of function name
, \ # of parameters
IS-TEMP-WL 0 =
IF
HERE WINAPLINK @, WINAPLINK! (communication)
THEN
HERE DUP R @ CELL + CELL +!
PARSE-NAME CHARS HERE SWAP DUP ALLOT MOVE 0 C, \ function name
HERE DUP R> CELL +!
PARSE-NAME CHARS HERE SWAP DUP ALLOT MOVE 0 C, \ library name
LoadLibraryA DUP 0 = IF -2009 THROW THEN \ ABORT "Library not found"
GetProcAddress 0 = IF -2010 THROW THEN \ ABORT "Procedure not found"
;
: WINAPI: ("ProcessName" "LibraryName" -)
(Used to import WIN32 procedures.
The resulting definition will have the name "ProcedureName".
The address of winproc field will be filled at the time of the first
fulfillment of the received dictionary entry.
To call the received "import" procedure parameters
pushed onto the data stack in the reverse order of
in C call this procedure. The result of the function
will be put on the stack.
)
NEW-WINAPI?
IF HEADER
ELSE
-one
> IN @ HEADER> IN!
THEN
['] _WINAPI-CODE COMPILE,
__Win:
;
SP @ VALUE spstore : sp-save SP @ TO spstore; : sp-restore spstore SP! ; : s-allot (n bytes - addr) sp-save spstore SWAP - ALIGNED DUP> R CELL-CELL- SP! R>; : ss (- addr u) NextWord 2> RR @ s-allot DUP DUP R @ + 0! 2R>> R SWAP R @ CMOVE R>; : s-free spstore CELL + SP! ; : 3DUP 2 PICK 2 PICK 2 PICK;
VOCABULARY winlibs
ALSO winlibs DEFINITIONS
:; WINAPIS s-free PREVIOUS;
: LIB: (- addr u id) s-free ss CR OVER LoadLibraryA DUP 0 = IF -2009 THROW THEN;
: NOTFOUND (addr u id addr u - addr u id)
2> R 3DUP 2R>
2DUP SHEADER
['] _WINAPI-CODE COMPILE,
HERE> R
0, \ address of winproc
0, \ address of library name
0, \ address of function name
-1, \ # of parameters
IS-TEMP-WL 0 =
IF
HERE WINAPLINK @, WINAPLINK! (communication)
THEN
HERE DUP R @ CELL + CELL +! > R
CHARS HERE SWAP DUP ALLOT MOVE 0 C, R> \ function name
HERE R> CELL +! 2> R
CHARS HERE SWAP DUP ALLOT MOVE 0 C, 2R> \ library name
SWAP GetProcAddress 0 = IF -2010 THROW THEN \ ABORT "Procedure not found"
;
PREVIOUS DEFINITIONS
: WINAPIS: sp-save 1 2 3 ALSO winlibs;
Source: https://habr.com/ru/post/220365/
All Articles