| |
|
| \ oof.fs Object Oriented FORTH |
\ oof.fs Object Oriented FORTH |
| \ This file is (c) 1996 by Bernd Paysan |
\ This file is (c) 1996,2000 by Bernd Paysan |
| \ e-mail: paysan@informatik.tu-muenchen.de |
\ e-mail: bernd.paysan@gmx.de |
| \ |
\ |
| \ Please copy and share this program, modify it for your system |
\ Please copy and share this program, modify it for your system |
| \ and improve it as you like. But don't remove this notice. |
\ and improve it as you like. But don't remove this notice. |
| \ |
\ |
| \ Thank you. |
\ Thank you. |
| \ |
\ |
| |
|
| \ The program uses the following words |
\ The program uses the following words |
| \ from CORE : |
\ from CORE : |
| \ decimal : bl word 0= ; = cells Constant Variable ! Create , allot @ IF |
\ decimal : bl word 0= ; = cells Constant Variable ! Create , allot @ |
| \ POSTPONE >r ELSE +! dup + THEN immediate r> * >body cell+ Literal drop |
\ IF POSTPONE >r ELSE +! dup + THEN immediate r> * >body cell+ |
| \ align here aligned DOES> execute ['] 2@ recurse swap 1+ over LOOP and |
\ Literal drop align here aligned DOES> execute ['] 2@ recurse swap |
| \ EXIT ?dup 0< rot r@ - i negate +LOOP 2drop BEGIN WHILE 2dup REPEAT 1- |
\ 1+ over LOOP and EXIT ?dup 0< ] [ rot r@ - i negate +LOOP 2drop |
| \ rshift > / ' move UNTIL or count |
\ BEGIN WHILE 2dup REPEAT 1- rshift > / ' move UNTIL or count |
| \ from CORE-EXT : |
\ from CORE-EXT : |
| \ nip tuck true ?DO compile, false Value erase pick :noname 0<> |
\ nip false Value tuck true ?DO compile, erase pick :noname 0<> |
| \ from BLOCK-EXT : |
\ from BLOCK-EXT : |
| \ \ |
\ \ |
| \ from EXCEPTION : |
\ from EXCEPTION : |
| \ from MEMORY : |
\ from MEMORY : |
| \ allocate free |
\ allocate free |
| \ from SEARCH : |
\ from SEARCH : |
| \ find definitions get-order set-order get-current wordlist set-current |
\ find definitions get-order set-order get-current wordlist |
| \ search-wordlist |
\ set-current search-wordlist |
| \ from SEARCH-EXT : |
\ from SEARCH-EXT : |
| \ also Forth previous |
\ also Forth previous |
| \ from STRING : |
\ from STRING : |
| \ /string compare |
\ /string compare |
| \ from TOOLS-EXT : |
\ from TOOLS-EXT : |
| \ [IF] [THEN] [ELSE] state |
\ [IF] [THEN] [ELSE] state |
| |
\ from non-ANS : |
| |
\ cell dummy [THEN] ?EXIT Vocabulary [ELSE] ( \G |
| |
|
| \ Loadscreen 27dec95py |
\ Loadscreen 27dec95py |
| |
|
| 1 cells Constant cell |
1 cells Constant cell |
| [THEN] |
[THEN] |
| |
|
| |
define? \G [IF] |
| |
: \G postpone \ ; immediate |
| |
[THEN] |
| |
|
| define? ?EXIT [IF] |
define? ?EXIT [IF] |
| : ?EXIT postpone IF postpone EXIT postpone THEN ; immediate |
: ?EXIT postpone IF postpone EXIT postpone THEN ; immediate |
| [THEN] |
[THEN] |
| types definitions |
types definitions |
| |
|
| : static ( -- ) \ oof- oof |
: static ( -- ) \ oof- oof |
| \G Create a class-wide cell sized variable |
\G Create a class-wide cell-sized variable. |
| mallot Create , #static , |
mallot Create , #static , |
| DOES> @ o@ + ; |
DOES> @ o@ + ; |
| : method ( -- ) \ oof- oof |
: method ( -- ) \ oof- oof |
| \G Create a method selector |
\G Create a method selector. |
| mallot Create , #method , |
mallot Create , #method , |
| DOES> @ o@ + @ execute ; |
DOES> @ o@ + @ execute ; |
| : early ( -- ) \ oof- oof |
: early ( -- ) \ oof- oof |
| \G Create a method selector for early binding |
\G Create a method selector for early binding. |
| Create ['] crash , #early , |
Create ['] crash , #early , |
| DOES> @ execute ; |
DOES> @ execute ; |
| : var ( size -- ) \ oof- oof |
: var ( size -- ) \ oof- oof |
| IF r> o, ELSE r> drop execute THEN o> false to method? ; |
IF r> o, ELSE r> drop execute THEN o> false to method? ; |
| |
|
| : cmethod, ( object early? -- ) |
: cmethod, ( object early? -- ) |
| state @ >r state on method, r> state ! ; |
state @ dup >r |
| |
0= IF postpone ] THEN |
| |
method, |
| |
r> 0= IF postpone [ THEN ; |
| |
|
| : early, ( object -- ) true to oset? true method, |
: early, ( object -- ) true to oset? true method, |
| state @ oset? and IF postpone o> THEN false to oset? ; |
state @ oset? and IF postpone o> THEN false to oset? ; |
| \ instance creation 29mar94py |
\ instance creation 29mar94py |
| |
|
| : instance, ( o -- ) alloc @ >r static new, r> alloc ! drop |
: instance, ( o -- ) alloc @ >r static new, r> alloc ! drop |
| DOES> state @ IF dup postpone Literal oset? IF postpone op! ELSE postpone >o THEN THEN early, ; |
DOES> state @ IF dup postpone Literal oset? IF postpone op! ELSE postpone >o THEN THEN early, |
| |
; |
| : ptr, ( o -- ) 0 , , |
: ptr, ( o -- ) 0 , , |
| DOES> state @ |
DOES> state @ |
| IF dup postpone Literal postpone @ oset? IF postpone op! ELSE postpone >o THEN cell+ |
IF dup postpone Literal postpone @ oset? IF postpone op! ELSE postpone >o THEN cell+ |
| get-order wordlist tuck classlist ! 1+ set-order |
get-order wordlist tuck classlist ! 1+ set-order |
| also types classlist @ set-current ; |
also types classlist @ set-current ; |
| |
|
| : (class ( parent -- ) |
: (class-does> DOES> false method, ; |
| |
|
| |
: (class ( parent -- ) (class-does> |
| here lastob ! true decl ! 0 ob-interface ! |
here lastob ! true decl ! 0 ob-interface ! |
| 0 , dup voc! dup lastparent ! |
0 , dup voc! dup lastparent ! |
| dup 0= IF 0 ELSE :method# + 2@ THEN methods ! vars ! |
dup 0= IF 0 ELSE :method# + 2@ THEN methods ! vars ! ; |
| DOES> false method, ; |
|
| |
|
| : (is ( addr -- ) bl word findo drop |
: (is ( addr -- ) bl word findo drop |
| dup defer? abort" not deferred!" |
dup defer? abort" not deferred!" |
| \G Create an instance pointer |
\G Create an instance pointer |
| Create immediate lastob @ here lastob ! instptr, ; |
Create immediate lastob @ here lastob ! instptr, ; |
| : asptr ( class -- ) \ oof- oof |
: asptr ( class -- ) \ oof- oof |
| \G Create an alias to an instance pointer, casted to another class |
\G Create an alias to an instance pointer, cast to another class. |
| cell+ @ Create immediate |
cell+ @ Create immediate |
| lastob @ here lastob ! , , instptr> ; |
lastob @ here lastob ! , , instptr> ; |
| |
|
| : Fpostpone postpone postpone ; immediate |
: Fpostpone postpone postpone ; immediate |
| |
|
| : : ( <methodname> -- ) decl @ abort" HOW: missing! " |
: : ( <methodname> -- ) \ oof- oof colon |
| |
decl @ abort" HOW: missing! " |
| bl word findo 0= abort" not found" |
bl word findo 0= abort" not found" |
| dup exec? over early? or over >body cell+ @ 0< or |
dup exec? over early? or over >body cell+ @ 0< or |
| 0= abort" not a method" |
0= abort" not a method" |
| |
|
| Forth |
Forth |
| |
|
| : ; ( xt colon-sys -- ) postpone ; |
: ; ( xt colon-sys -- ) \ oof- oof |
| |
postpone ; |
| m-name @ dup >body swap exec? |
m-name @ dup >body swap exec? |
| IF @ o@ + |
IF @ o@ + |
| ELSE dup cell+ @ 0< IF 2@ swap o@ + @ + THEN |
ELSE dup cell+ @ 0< IF 2@ swap o@ + @ + THEN |
| |
|
| Objects definitions |
Objects definitions |
| |
|
| : implement ( interface -- ) |
: implement ( interface -- ) \ oof-interface- oof |
| align here over , ob-interface @ , ob-interface ! |
align here over , ob-interface @ , ob-interface ! |
| :ilist + @ >r get-order r> swap 1+ set-order 1 voc# +! ; |
:ilist + @ >r get-order r> swap 1+ set-order 1 voc# +! ; |
| |
|
| : inter-method, ( interface -- ) |
: inter-method, ( interface -- ) \ oof-interface- oof |
| :ilist + @ bl word count 2dup s" '" compare |
:ilist + @ bl word count 2dup s" '" str= |
| 0= dup >r IF 2drop bl word count THEN |
dup >r IF 2drop bl word count THEN |
| rot search-wordlist |
rot search-wordlist |
| dup 0= abort" Not an interface method!" |
dup 0= abort" Not an interface method!" |
| r> IF drop state @ IF postpone Literal THEN EXIT THEN |
r> IF drop state @ IF postpone Literal THEN EXIT THEN |
| |
|
| Vocabulary interfaces interfaces definitions |
Vocabulary interfaces interfaces definitions |
| |
|
| : method ( -- ) mallot Create , inter# @ , |
: method ( -- ) \ oof-interface- oof |
| |
mallot Create , inter# @ , |
| DOES> 2@ swap o@ + @ + @ execute ; |
DOES> 2@ swap o@ + @ + @ execute ; |
| |
|
| : how: ( -- ) align |
: how: ( -- ) \ oof-interface- oof |
| |
align |
| here lastif @ ! 0 decl ! |
here lastif @ ! 0 decl ! |
| here last-interface @ , last-interface ! |
here last-interface @ , last-interface ! |
| inter-list @ , methods @ , inter# @ , |
inter-list @ , methods @ , inter# @ , |
| methods @ :inum cell+ ?DO ['] crash , LOOP ; |
methods @ :inum cell+ ?DO ['] crash , LOOP ; |
| |
|
| : interface; ( -- ) old-current @ set-current |
: interface; ( -- ) \ oof-interface- oof |
| |
old-current @ set-current |
| previous previous ; |
previous previous ; |
| |
|
| : : ( <methodname> -- ) decl @ abort" HOW: missing! " |
: : ( <methodname> -- ) \ oof-interface- oof colon |
| |
decl @ abort" HOW: missing! " |
| bl word count lastif @ @ :ilist + @ |
bl word count lastif @ @ :ilist + @ |
| search-wordlist 0= abort" not found" |
search-wordlist 0= abort" not found" |
| dup >body cell+ @ 0< 0= abort" not a method" |
dup >body cell+ @ 0< 0= abort" not a method" |
| |
|
| Forth |
Forth |
| |
|
| : ; ( xt colon-sys -- ) postpone ; |
: ; ( xt colon-sys -- ) \ oof-interface- oof |
| |
postpone ; |
| m-name @ >body @ lastif @ @ + ! ; immediate |
m-name @ >body @ lastif @ @ + ! ; immediate |
| |
|
| Forth definitions |
Forth definitions |
| |
|
| : interface ( -- ) |
: interface-does> |
| Create here lastif ! 0 , get-current old-current ! |
DOES> @ decl @ IF implement ELSE inter-method, THEN ; |
| |
: interface ( -- ) \ oof-interface- oof |
| |
Create interface-does> |
| |
here lastif ! 0 , get-current old-current ! |
| last-interface @ dup IF :inum @ THEN 1 cells - inter# ! |
last-interface @ dup IF :inum @ THEN 1 cells - inter# ! |
| get-order wordlist |
get-order wordlist |
| dup inter-list ! dup set-current swap 1+ set-order |
dup inter-list ! dup set-current swap 1+ set-order |
| true decl ! |
true decl ! |
| 0 vars ! :inum cell+ methods ! also interfaces |
0 vars ! :inum cell+ methods ! also interfaces ; |
| DOES> @ decl @ IF implement ELSE inter-method, THEN ; |
|
| |
|
| previous previous |
previous previous |
| |
|
| |
|