/ conditional-compilation /

Conditional compilation

description:


So far, let this message be here. Probably later I will
write something better (mlg).


Subject: Re: Conditional compilation
Date: Fri, 26 Oct 2001 01:48:52 +0400
From: "Michael L.Gassanenko" <m_l_g3@yahoo.com>
Organization: St.Petersburg University
Newsgroups: comp.lang.forth

Jeff Penn wrote:
>
> I have been cleaning up an application which uses conditional compilation.
> To avoid [IF]/[ELSE]/[THEN] from cluttering up source files I use a 'make'
> file to compile the application:
>
> \ ** Options section **
> TRUE  CONSTANT i
> i 0=  CONSTANT j  \ i and j mutually exclusive
> FALSE CONSTANT k
>
> \ ** Compilation section **
>
> [UNDEFINED] tools  [IF]  INCLUDE tools.4  [THEN]
>
> j  [IF]  INCLUDE appa.4  [THEN]
>
> i  [IF]  INCLUDE appi.4  INCLUDE appx.4
> [ELSE]
>   k  [IF]  INCLUDE appjk.4  INCLUDE appy.4
>   [ELSE]   INCLUDE appj.4  INCLUDE appx.4
>   [THEN]
> [THEN]
>
> This clutters up the compilation section of the make file.
>
> Using a technique suggested in the "Forth Programmer's Handbook" I came up
> with this:
>
> \ ** Options section **
> TRUE               CONSTANT i  \ j if FALSE
> FALSE i INVERT AND CONSTANT k
>
> : \def?   ( -- )  POSTPONE [DEFINED]  IF POSTPONE \ THEN  ; IMMEDIATE
> : \-def?  ( -- )  POSTPONE [UNDEFINED]  IF POSTPONE \ THEN  ; IMMEDIATE
>
> : \i  ( -- )  i INVERT  IF  POSTPONE \  THEN  ; IMMEDIATE
> : \j  ( -- )  i         IF  POSTPONE \  THEN  ; IMMEDIATE
>
> : \k   ( -- )  k INVERT  IF  POSTPONE \  THEN  ; IMMEDIATE
> : \-k  ( -- )  k         IF  POSTPONE \  THEN  ; IMMEDIATE
>
> \ ** Compilation section **
>
> \def? tools  INCLUDE tools.4
>
> \j     INCLUDE appa.4
>
> \i     INCLUDE appi.4
> \j \-k INCLUDE appj.4
> \j \k  INCLUDE appjk.4
>    \-k INCLUDE appx.4
> \j \k  INCLUDE appy.4
>
> Which unclutters the compilation section, at the expense of the options
> section.
>
> Is this more readable?.
>
> Is there a better way to define \i \j \k & \-k which isn't too complicated?.

1) When I see \i , I think: is it skip-if-i-is-true,
or is it do-if-i-is-true-else-skip ?

I used names like board: and pc: .

: OPTION
     CREATE , IMMEDIATE DOES> @ 0= IF [COMPILE] \ THEN
;

FALSE OPTION pc:
TRUE OPTION brd:
TRUE OPTION dbg:

More complicated:

: OPTIONS
    DUP OPTION 0= OPTION
;

FALSE OPTIONS pc: ~pc:
TRUE OPTIONS brd: ~brd:
TRUE OPTIONS dbg: ~dbg:

Or, alternatively:

: ~
    ' >BODY @ IF [COMPILE] \ THEN
; IMMEDIATE

pc: ~ dbg: INCLUDE ...
~ pc: ~ dbg: INCLUDE ...

2) the notation like

pc: dbg: INCLUDE fn1
brd: dbg: INCLUDE fn2

is indeed more readable.

-- --
I used this scheme in real projects, and what followed
things like dbg: was not INCLUDEs. There were magic numbers,
code fragments, etc., but I do not remember any INCLUDEs.

-- --
disclaimer:
I used definitions like

: pc: [COMPILE] \ ; IMMEDIATE
\ : pc: ; IMMEDIATE

and did not try the code that I posted here.

Best regards, Michael Gassanenko
--
the right question is half the answer


generated Wed Jul 23 02:53:42 2003mlg