Wanted: One Specific Piece of Software

From: gwynp_at_artware.qc.ca <(gwynp_at_artware.qc.ca)>
Date: Mon Dec 31 03:06:04 2001

On 30-Dec-2001 Sellam Ismail wrote:
> On Sat, 29 Dec 2001 gwynp_at_artware.qc.ca wrote:
>
>> Which aren't what you want. But let me heartily recomend Clipper.
>> It compiles 99% of dBase programs and more. The 2 features I really
>> liked of Clipper where that it worked like a real compiler (ie,
>> compiled to .obj files, linked to .exe. Back in the day I used a 3rd
>> party incremental linker which saved much time during compiles) but
>
> Yes, I used an incremental linker as well ("Blinker" is what it was
> called if I'm not mistaken). It made a tremendous difference on a 286 :)

Blinker it was.

> Clipper did/does rock, but once I got into FoxPro I preferred it.

What did foxpro have that clipper didn't?
 
>> above all, XCOMMANDS! These allowed you to add new syntax to the
>> language, which would be mapped onto function calls. Think of it as a
>> sophisticated pre-processor. I've heard rumours of someone
>> implementing Fortran as Clipper xcommands.
>
> Never used or even heard of those but that sounds cool.

Eeep! Then you either switched to FoxPro too soon, or didn't drink fully
of Clipper.

Here are 2 examples or xcommands:

    #xcommand DEFAULT <v1> TO <x1> [, <vn> TO <xn> ] ;
              => ;
              IF <v1> == NIL ; <v1> := <x1> ; END ;
              [; IF <vn> == NIL ; <vn> := <xn> ; END ]

This maps the command :
        default foo to "hello"
To
        IF foo == NIL ; foo := "hello" ; END

the <vn> an <xn> mean that
        default foo to "hello", bar to "world", biffle to 10
turns into
        IF foo == NIL ; foo := "hello" ; END
        IF bar == NIL ; bar := "world" ; END
        IF biffle == NIL ; biffle := 10 ; END

Here's a more complex example :

    #command _at_ <row>, <col> GET PASSWORD <cWord> [PICTURE <cPic>] ;
                        [SEND <msg>] [COLOUR <clr>] [valid <fvalid>] ;
                                                                        ;
      => SetPos( <row>, <col> ) ;
       ; AAdd( GetList, ;
           GetNew( <row>, <col>, ;
                   {|cNew| IF(pcount()==0, <cWord>, <cWord>:=cNew)}, ;
                   <"cWord">,<cPic>,<clr>) ;
             ):reader:={|o| Pass_read(o) } ;
      [; ATail(GetList):<msg>] ;
      [; ATail(GetList):postblock:=<{fvalid}>] ;
       ; Pass_disp(ATail(GetList))

This extends the _at_ ...GET so to add a password entry (ie, echo * instead
of what's typed). AAdd and ATail were array manip functions, GetList is a
global array of what's in the current _at_ ... GET page. GetNew is a
constructor in the crude OO that clipper 5.0 had. Pass_read and Pass_disp
where functions I supplied.

Perl (source-filters) and Forth (redefine basic words) allow similar
tomfoolery. I've always found language that allows one to change and
augment the basic syntax to be Extra Good.

-Philip
Received on Mon Dec 31 2001 - 03:06:04 GMT

This archive was generated by hypermail 2.3.0 : Fri Oct 10 2014 - 23:33:42 BST