1. Introduction
  
   Any time ago i have downloaded from Oasis hintp - .ppo interpreter. It
   works but not as good as i expected. So i wrote my own interpreter -
   BL. BL is scripting language for Clipper programs. Source code of BL
   is pure Clipper and can be compiled with any Clipper 5.x compiler or
   FlagShip. BL is simple and rather fast because uses Clipper for
   expression evaluation. BL is not a ppo interpreter, it's a different
   language.
   
    1.1 Where to get BL
    
   You can download sources here (about 12Kb)
   
    1.2 How to contact author
    
   My name is Sergey Aleshin, i am programmer from Russia
   
   e-mail: asg2@mail.ru
   
  2. Expressions
  
   Expressions in BL same as Clipper expressions except for ++,--,+= etc.
   You can't write code blocks like in Clipper but can use 'block'
   function: {|x,y,..| f(x,y,...)} must be replaced with
   block("f(x,y,...)",{"x","y",...})
   
   In short, you can use any expression that allowed in code block.
   
  3. Program structure
  
   BL program consists from main part - sequence of operators, and
   procedure definitions:
<operator0>
...
<operatorN>
proc p1
<operators>
endp
...
proc pN
<operators>
endp

   For BL program sample see *.bl files.
   
   Operators delimited by CR+LF (LF on UNIX) so you can write only one
   operator per line.
   
  4. Operators
  
    4.1 If
    
   Syntax:
if <expr>
<operators>
[elif <expr>
<operators>]
...
[elif <expr>
<operators>]
[else
<operators>]
endif

    4.2 For
    
   Syntax (similar to C):
for [<init_expr>];[<exit_expr>];[<iteration_expr>]
<operators>
next

   Sample:
for i:=1;i<=10;i:=i+1
 s:=s+i
next

   Endless loop:
for ;;
k:=inkey(0)
if k==27
 exit
endif
next

    4.3 While
    
   Syntax:
while <expr>
<operators>
endw

    4.4 Exit
    
   Exits closest For or While.
   
    4.5 Loop
    
   Go to next loop iteration.
   
    4.6 Call
    
   Syntax:
call <BL procedure name>

    4.7 Return
    
   Return from any place of BL procedure  Syntax:
return [<expr>]

   If <expr> is specified, it will evaluated and pushed to stack
   
    4.8 Private
    
   Declare private variables. Syntax:
private var1,...,varN

    4.9 Public
    
   Declare public variables. Syntax same as for private.
   
    4.10 Release
    
   Destroy any private or public variables. Syntax:
release var1,...,varN

  5. Procedures
  
   Syntax:
proc <procedure name>
[param p1,...,pN]
<operators>
endp

   Keyword 'param' can be used to declare procedure parameters.
   Parameters for procedure must be placed in stack with push operator,
   then procedure can be called with call operator:
push x
push y
call mul
pop result

proc mul
param a,b
return a*b
endp

   param p1,...,pN is short representation of
private p1,..,pN
pop pN
...
pop p1

   You can use recursion in BL.
   
  6. Using external scripts
  
   You can use loadlib operator to include code from other file to your
   script. Syntax:
loadlib <filename.ext>

  7. Using BL from Clipper
  
   There are 2 functions, 'progparse' and 'progrun'. PROGPARSE takes the
   text of program and produces array with precompiled code. Then code
   can be executed with PROGRUN function. See main.prg for example.
   
  8. Licence
  
   Public Domain
   
  9. Known problems
  
   BL stores procedures entry points in static array. So you can't
   execute more than one precompiled script if it uses procedures:
   progparse clears that array. You'll need to call both progparse and
   progrun for such scripts.
   
  10. Future plans
  
   I think that simple visual debugger like cld may be useful.