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"
        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.

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