      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.