Formula Solver 1.4 5/

 BBS: Inland Empire Archive
Date: 03-19-93 (21:00)             Number: 372
From: QUINN TYLER JACKSON          Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Formula Solver 1.4    5/       Conf: (2) Quik_Bas
>>> Continued from previous message
        ELSE
            ErrorCode = eqjDivisionByZero
        END IF
    CASE "?"    ' random number from 0 to x, seed y
        RANDOMIZE y
        x = RND * x
    CASE "<<"   ' bitshift left y by x bits
        x = INT(y) * 2 ^ INT(x)
    CASE ">>"   ' bitshift right y by x bits
        x = INT(y) \ 2 ^ INT(x)
    CASE "!"    ' factorial
        Temp& = 1
        FOR i% = 1 TO x
                Temp& = Temp& * i%
        NEXT i%
        x = Temp&
    CASE "`"
        x = ABS(x)
    CASE "#"    ' absolute
        x = INT(x)
    CASE "<"    ' logical less than than
        x = x < y
    CASE "<=", "=<" ' logical less than or equal to
        x = x <= y
    CASE ">"    ' logical greater than
        x = x > y
    CASE ">=", "=>" ' logical greater than or equal to
        x = x >= y
    CASE "=="    ' logical equality
        x = x = y
    CASE "<>" ' logical inequality
        x = x <> y
    CASE "|=", "=|" ' logical implication
        x = x IMP y
    CASE "&=", "=&" ' logical equivlance
        x = x EQV y
    CASE "&"   ' bitwise AND
        x = x AND y
    CASE "|"    ' bitwise OR
        x = x OR y
    CASE "~"    ' bitwise XOR
        x = x XOR y
END SELECT
END SUB

SUB sqjAssignFun (FunctName$, Formula$, Protection%)

FunctName$ = UCASE$(FunctName$)

ParPtr% = INSTR(FunctName$, "[")
NamePart$ = LEFT$(FunctName$, ParPtr% - 1)
ParamPart$ = MID$(FunctName$, ParPtr% + 1, LEN(FunctName$) - ParPtr% -_
 1)

' First we see if this function is already in the list
FOR i% = 1 TO SymPtr
    IF SymTable(i%).SymType = SymFUNCTION THEN
        IF RTRIM$(SymTable(i%).SymName) = NamePart$ THEN
            IF SymTable(i%).SymLvl <> PROTECTED THEN
                ' Since it was, just change its formula
                IF ParamPart$ <> "" THEN
                    ' Make sure it just isn't a formula
                    ' that uses empty parenthesis for the params.
                    ParTable(SymTable(i%).TabPtr) = ParamPart$
                END IF
            ELSE
                ErrorCode = eqjProtectedFunction
            END IF
            ForTable(SymTable(i%).TabPtr) = Formula$
            EXIT SUB
        END IF
    END IF
NEXT i%

IF SymPtr < SYMMAX THEN
    ' Since it wasn't, put it there
    FunPtr = FunPtr + 1
    SymPtr = SymPtr + 1

    IF FunPtr <= FUNMAX THEN
        SymTable(SymPtr).SymName = NamePart$
        SymTable(SymPtr).SymType = SymFUNCTION
        SymTable(SymPtr).SymLvl = Protection%
        SymTable(SymPtr).TabPtr = FunPtr
        ParTable(FunPtr) = ParamPart$
        ForTable(FunPtr) = Formula$
    ELSE
        ErrorCode = eqjFunctionTableFull
    END IF
ELSE
    ErrorCode = eqjSymbolTableFull
END IF
END SUB

SUB sqjAssignVar (VarName$, VarValue, Protection%)
VarName$ = UCASE$(VarName$)

' First we see if this variable is already in the list
FOR i% = 1 TO SymPtr
    IF SymTable(i%).SymType = SymVARIABLE THEN
        IF RTRIM$(SymTable(i%).SymName) = VarName$ THEN
            IF SymTable(i%).SymLvl <> PROTECTED THEN
                IF SymTable(i%).SymLvl = LvlPtr THEN
                    ' Since it was, just change its value
                    VarTable(SymTable(i%).TabPtr) = VarValue
                    EXIT SUB
                END IF
            ELSE
                ErrorCode = eqjProtectedVariable
                EXIT SUB
            END IF
        END IF
    END IF
NEXT i%

IF SymPtr < SYMMAX THEN
    ' Since it wasn't, put it there
    VariPtr = VariPtr + 1
    SymPtr = SymPtr + 1

    IF VariPtr <= VARMAX THEN
        SymTable(SymPtr).SymName = VarName$
        SymTable(SymPtr).SymType = SymVARIABLE
        SymTable(SymPtr).TabPtr = VariPtr
        SymTable(SymPtr).SymLvl = Protection%
        VarTable(VariPtr) = VarValue
    ELSE
        ErrorCode = eqjVariableTableFull
    END IF
ELSE
    ErrorCode = eqjSymbolTableFull
END IF
END SUB

SUB sqjDesParse (Phase%, x)

SHARED TestDeep%    ' This variable used for testing how deep recursion_
 goes
' This is the central cortex of this module.
' It uses wicked recursion, so beware!  In fact, this routine is so
' recursive that unless you're a major masochist, you'd better leave it
' well enough alone!
TestDeep% = TestDeep% + 1   ' Used for testing phase only
>>> Continued to next message

 * OLX 2.1 TD * A program is just a big bug that happened to work....

--- Maximus/2 2.01wb
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET