184.108.40.2064.50 REQUIRED FILE EXT
If the file specified by c-addr u has been INCLUDED or REQUIRED already, but not between the definition and execution of a marker (or equivalent usage of FORGET), discard c-addr u; otherwise, perform the function of INCLUDED.
An ambiguous condition exists if a file is REQUIRED while it is being REQUIRED or INCLUDED.
An ambiguous condition exists, if a marker is defined outside and executed inside a file or vice versa, and the file is REQUIRED again.
An ambiguous condition exists if the same file is REQUIRED twice using different names (e.g., through symbolic links), or different files with the same name are REQUIRED (by doing some renaming between the invocations of REQUIRED).
An ambiguous condition exists if the stack effect of including the file is not ( i * x -- i * x ).
\ copy a memory block into a newly allocated region in the heap
DUP ALLOCATE THROW
SWAP 2DUP R> ROT ROT MOVE ;
: name-add ( addr u listp -- )
>R save-mem ( addr1 u )
3 CELLS ALLOCATE THROW \ allocate list node
R@ @ OVER ! \ set next pointer
DUP R> ! \ store current node in list var
CELL+ 2! ;
: name-present? ( addr u list -- f )
ROT ROT 2>R BEGIN ( list R: addr u )
DUP CELL+ 2@ 2R@ COMPARE 0= IF
DROP 2R> 2DROP TRUE EXIT
( DROP 0 ) 2R> 2DROP ;
: name-join ( addr u list -- )
>R 2DUP R@ @ name-present? IF
R> DROP 2DROP
VARIABLE included-names 0 included-names !
: included ( i*x addr u -- j*x )
2DUP included-names name-join
: REQUIRED ( i*x addr u -- i*x )
2DUP included-names @ name-present? 0= IF
required-helper2.fs. Both of which hold the text:
S" required-helper1.fs" REQUIRED \ Increment TOS
REQUIRE required-helper1.fs \ Ignore - already loaded
INCLUDE required-helper1.fs \ Increment TOS
-> 2 }T
INCLUDE required-helper2.fs \ Increment TOS
S" required-helper2.fs" REQUIRED \ Ignored - already loaded
REQUIRE required-helper2.fs \ Ignored - already loaded
S" required-helper2.fs" INCLUDED \ Increment TOS
-> 2 }T