oster@dewey.soe.berkeley.edu (David Phillip Oster) (07/22/87)
As promised, here is a simple, pascal flavored record sturcture package for
forth. It lets you define record structure types, create variables of that
type, and address the fields of those variables.
Inheritance, and message passing are left as exercises for the reader.
----------------------------
( Pascalish Record Package,for FORTH 83 dpo 7/22/87 )
VARIABLE INRECORD ( Holds a flag )
( DOOFFSETR - Runtime of .PascalField )
( must be a separate word, so that DOES> will see semicolon )
: DOOFFSETR DOES> ( adrRecord adrOffset - adrRecord+Offset )
@ + ;
( DOPASREC - run time actions for PascalType: )
( two major cases: declaring a .PascalField, declaring a var )
: DOPASREC ( -- ) DOES> @ CREATE INRECORD @ IF
OVER , DOOFFSETR + ELSE
ALLOT THEN ;
\ define a type that is NOT composed of smaller types. n = length in bytes
: MAKEREC: ( n - ; name ) CREATE , DOPASREC ;
\ begin a record definition
: RECORD ( - 0 | intialize vars ) INRECORD ON 0 ;
\ end a record definition
: ENDREC: ( n - ; name ) INRECORD OFF MAKEREC: ;
\ turn a type name into its size
: SIZEOF< ( - n ; name ) ' >BODY @
STATE @ IF COMPILE (LIT) , THEN ; IMMEDIATE
( Macintosh primitive types. Lengths in bytes 12/26/84 dpo)
4 MAKEREC: LongInt:
2 MAKEREC: Integer:
1 MAKEREC: Boolean:
8 MAKEREC: Pattern:
4 MAKEREC: RgnHandle:
4 MAKEREC: Handle:
4 MAKEREC: PTR:
(some Macintosh compound types )
RECORD
Integer: .ASCENT
Integer: .DESCENT
Integer: .WIDMAX
Integer: .LEADING
ENDREC: FontInfoRec:
RECORD
Integer: .v
Integer: .h
ENDREC: Point:
RECORD
Point: .topLeft
Point: .botRight
ENDREC: Rect:
: .top .topLeft .v ;
: .left .topLeft .h ;
: .bottom .botRight .v ;
: .right .botRight .h ;
( some variable definitions)
Rect: myRect1
Handle: myHandle
( an example of using variables and field selectors )
4 myRect1 .top !
4 myRect1 .left !
40 myRect1 .bottom !
40 myRect1 .right !
myRect1 FrameRect
sizeof< Rect: NewHandle myHandle !
----------------------------------------
Points to note -- names that end in ':' are defining words.
Type names, (created with EndRec:) when used in the context of a record
definition, define field selectors, otherwise, they define variables.
Field selectors take an address, and adjust that address to point at their
field.
SizeOf< takes a type name from the input stream, and returns the length of
the type.
--- David Phillip Oster --My Good News: "I'm a perfectionist."
Arpa: oster@dewey.soe.berkeley.edu --My Bad News: "I don't charge by the hour."
Uucp: {seismo,decvax,...}!ucbvax!oster%dewey.soe.berkeley.edu