Существенно большую популярность, чем
Clipper и соответственно его "наследник"
(x)Harbour на просторах России завоевал
(Visual) FoxPro... замечу, что данная система полностью снимается с поддержки её владельцем Microsoft в 2015 году.
Как и все системы разработки группы xBase фокс очень сильно отличается по командам и функциям от Clipper/Harbour (знаю, т.к. программы CST/XBM входящие в УС Лэнд написаны на нем), но... и
это иллюстрирует мощь заложенных в Харбор концепций стандарт языка FoxPro элементарно и "компактно" реализуется системой препроцессора языка (x)Harbour. Приведу пример реализации
ВСЕХ уникальных команд FoxPro на Harbour (там же ссылка на автора библиотеки):
Код:
/*
File: hbfoxlib.ch
Version: 1.1
Author: Alex Antypenko
Description: Foxpro command for (x)Harbour
Notes: This is the header file for library that contains the implementation FoxPro commands and functions.
*/
#ifndef _HBFOXLIB_DEFINED
#define _HBFOXLIB_DEFINED
#xtranslate AND => .and.
#xtranslate OR => .or.
#command DIMENSIONS <!name1!>( <dim1,...> ) [, <!nameN!>( <dimN,...> ) ] => ;
PRIVATE <name1>\[ <dim1> \] [, <nameN>\[ <dimN> \] ]
/* commands using FIELDS clause which is not accepted by Clipper */
#command DISPLAY [FIELDS <v,...>] [<off:OFF>] ;
[<prn:TO PRINTER>] [TO FILE <(f)>] ;
[FOR <for>] [WHILE <while>] [NEXT <next>] ;
[RECORD <rec>] [<rest:REST>] [<all:ALL>] => ;
__dbList( <.off.>, { <{v}> }, <.all.>, ;
<{for}>, <{while}>, <next>, ;
<rec>, <.rest.>, <.prn.>, <(f)> )
#command SCATTER FIELDS <f1> [,<fn>] ;
[<mm: MEMO>] ;
[TO] MEMVAR => ;
[ PRIVATE <f1>:=iif(!<.mm.> .and. fieldtype(fieldpos(<"f1">))=="M","", field-><f1>)];
[;PRIVATE <fn>:=iif(!<.mm.> .and. fieldtype(fieldpos(<"fn">))=="M","", field-><fn>)]
#command SCATTER FIELDS <f1> [,<fn>] ;
[MEMO] ;
[TO] MEMVAR BLANK => ;
[PRIVATE <f1>:=fox_fieldBlank(fieldpos(<"f1">))];
[;PRIVATE <fn>:=fox_fieldBlank(fieldpos(<"fn">))]
#command SCATTER [TO] MEMVAR ;
[<mm: MEMO>] ;
[<bb: BLANK>] => ;
;PRIVATE ___i,___m ;
;FOR ___i:=1 to FCount() ;
; ___m:=FieldName(___i) ;
; PRIVATE &___m ;
; IIF(<.bb.>,__mvPut(___m,fox_fieldBlank(___i)),IIF(!<.mm.> .and. FieldType(___i)=="M",__mvPut(___m,""),__mvPut(___m,fieldGet(___i)) ));
;NEXT
#command SCATTER TO <arr>;
[<mm: MEMO>] ;
[<bb: BLANK>] => ;
<arr>:={} ;
;PRIVATE ___ch;
;FOR ___ch:=1 TO FCount() ;
; IIF(<.bb.>, AAdd(<arr>,fox_fieldBlank(___ch)),IIF(!<.mm.> .and. FieldType(___ch)=="M",AAdd(<arr>,""),AADD(<arr>,FieldGet(___ch))));
;NEXT
#command GATHER MEMVAR FIELDS <f1> [,<fn>] ;
[MEMO] => ;
[field-><f1>:=&("m->"+<"f1">)];
[;field-><fn>:=&("m->"+<"fn">)]
#command GATHER MEMVAR ;
[<mm: MEMO>] => ;
;PRIVATE ___lch,___m_f ;
;FOR ___lch:=1 TO FCount() ;
; ___m_f:="m->"+FieldName(___lch) ;
; IIF(Type(___m_f)!="U",IIF(<.mm.> .or. FieldType(___lch)!="M",FieldPut(___lch,&___m_f)),);
;NEXT
#command GATHER FROM <arr> ;
[<mm: MEMO>] => ;
;PRIVATE ___lch1 ;
;FOR ___lch1:=1 TO Len(<arr>) ;
; IIF(<.mm.> .or. FieldType(___lch1)!="M",FieldPut(___lch1,<arr>\[___lch1\]),);
;NEXT
#command SCAN ;
[FOR <for>] ;
[WHILE <while>] ;
[NEXT <next>] ;
[RECORD <rec>] ;
[<rest:REST>] ;
[<all:ALL>] ;
[<nooptimize:NOOPTIMIZE>] ;
=> ;
;PRIVATE lExit:=.F. ;
;fox_ScanBegin( <"for"> , <{for}>, <{while}>, ;
<next>, <rec>, <.rest.>, <.nooptimize.>) ;
; WHILE !EOF().AND.!lExit ;
; IIF(!fox_ScanNext(),lExit:=.T.,)
#command ENDSCAN => ;
; END ;
;fox_ScanEnd()
#command _USE <(db)> ;
[VIA <rdd>] ;
[IN <in>] ;
[ALIAS <alias>] ;
[<new: NEW>] ;
[<ex: EXCLUSIVE>] ;
[<sh: SHARED>] ;
[<ro: READONLY>] ;
[ASCENDING] ;
[<desc: DESCENDING>] ;
[<noUpdate: NOUPDATE>] ;
[CODEPAGE <codepage>] ;
[INDEX <ilist,...>] ;
[ORDER <(xOrder)>] ;
[TAG <cTag>] ;
[OF <xOf>] ;
=>;
fox_useArea(<(db)>,<(alias)>,<rdd>,<in>,NIL , ;
<.new.>,iif(<.sh.> .or. <.ex.>, !<.ex.>, NIL), ;
<.ro.>, <.noUpdate.>, <.desc.>, ;
{ <(ilist)> },<(xOrder)>,<"cTag">,<"xOf">,<codepage>)
// mini SQL commands
#command CREATE TABLE <(filename)> ;
FROM [ARRAY] <arr> ;
[VIA <ddriver>] ;
=> ;
dbcreate(<(filename)>,<arr>,<ddriver>)
#command CREATE DBF <(filename)> ;
FROM [ARRAY] <arr> ;
[VIA <ddriver>] ;
=> ;
dbcreate(<(filename)>,<arr>,<ddriver>)
#command CREATE TABLE <(filename)> <(fields_data)> ;
[VIA <ddriver>] ;
=> ;
fox_CreateTable(<(filename)>,<"fields_data">,<ddriver>)
#command INSERT INTO <(filename)> <(fields_data)> ;
VALUES <valData> ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)> , <"fields_data">,<"valData">,<ddriver>)
#command INSERT INTO <(filename)> ;
VALUES <valData> ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)> , "", <"valData">,<ddriver>)
#command INSERT INTO <(filename)> <(data)> ;
FROM ARRAY <valData> ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)>, <(data)>,<valData>,<ddriver>)
#command INSERT INTO <(filename)> ;
FROM ARRAY <valData> ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)>, "",<valData>,<ddriver>)
#command INSERT INTO <(filename)> <(data)> ;
FROM MEMVAR ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)>,<(data)>,,<ddriver>)
#command INSERT INTO <(filename)> ;
FROM MEMVAR ;
[VIA <ddriver>] ;
=> ;
fox_InsertData(<(filename)>,"",,<ddriver>)
// 15.11.2012
#command GO TOP IN <cTableAlias> => <cTableAlias>->(DbGoTop())
#command GO BOTTOM IN <cTableAlias> => <cTableAlias>->(DbGoBottom())
#command GOTO <nRecno> IN <cTableAlias> => <cTableAlias>->(DbGoTo(<nRecno>))
#xtranslate RECCOUNT(<cTableAlias>) => <cTableAlias>->( RecCount() )
#xtranslate FCOUNT(<cTableAlias>) => <cTableAlias>->( FCount() )
#xtranslate FILTER(<cTableAlias>) => <cTableAlias>->( DbFilter() )
#xtranslate USED(<cTableAlias>) => <cTableAlias>->(Used())
#xtranslate USED(<nWorkArea>) => (<nWorkArea>)->(Used())
#command SET FILTER TO <cFilter> IN <cTableAlias> => ;
<cTableAlias>->(DbSetFilter( <{cFilter}>, <"cFilter"> ))
#command SEEK <eExpression> [<soft: SOFTSEEK>] [<last: LAST>] TAG <cTagName> IN <cTableAlias> => ;
fox_Seek(<(eExpression)>,<.soft.>, <.last.>,<(cTableAlias)>, <(cTagName)>)
//
#endif
То есть вставив в код программы команду:
#include "FoxBibl.ch"
я могу писать на языке FoxPro! Скажу больше, для "извращенцев" - встречалась библиотечка реализации классов и функций интерпретатора "1С:Предприятие 7.7", т.е. на Харборе могу писать на языке "1С"