On 30-Dec-2001 Sellam Ismail wrote:
On Sat, 29 Dec 2001 gwynp(a)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 @ <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 @ ...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 @ ... 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