Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagepython
operands = []
...
def popOperands(n):
    global operands
    size = len(operands)
    if size >= n:
        result = operands[size - n : size]
        global operands
        operands = operands[0 : size - n]
        return result
    else:
        return None

popOperands tar inn antall operander som skal pop-es som argument.

Først sjekker den om det er nok operander i operands-lista. I så fall så henter lager den en ny liste bestående av de siste n elementene i lista og husker dem i result-variablen. Notasjonen list[n : m] en hendig måte å lage en ny liste bestående av elementene fra n til (men ikke med) m fra list. Dersom en skal hente uten resten av lista fra element n, som en gjør her, så kan bruke kortformen list[n :].

Etter at result er tilordnet, så skal vi fjerne de samme elementene fra operands-lista. Her velger vi å ikke endre lista, men å lage en helt ny liste som operands tilordnes. En skulle tro at det var nok å skrive operands = ... men det vil opprette en ny operands-variabel i funksjonsarket, tilsvarende result. Derfor har vi først setningen global operands (helst først i funksjonen), fordi det deklarerer at operands er ment å være en variabel deklarert utenfor funksjonen, altså i rpncalc3-arket.

Til slutt returneres result-lista, altså de ønskede operandene, som ikke lenger finnes i operands-lista.

Dersom det ikke er nok operander i lista, så returneres verdien None, som brukes for å angi nettopp "ingen verdi" eller "ingenting". Denne kan sjekkes med is None, som vi skal se lenger ned.

...

Code Block
languagepython
# rpncalc3.py
operands = []

def isOperand(token):
    try:
        float(token)
        return True
    except ValueError:
        return False

def printOperands():
    print(operands)

def popOperands(n):
    global operands
    size = len(operands)
    if size >= n:
        result = operands[size - n : size]
        global operands
        operands = operands[0 : size - n]
        return result
    else:
        return None

def pushOperand(operand):
    operands.append(operand)

def plus():
    ops = popOperands(2)
    if not (ops is None):
        pushOperand(ops[0] + ops[1])

def minus():
    ops = popOperands(2)
    if not (ops is None):
        pushOperand(ops[0] - ops[1])

# the functions above handles all access to the operand stack
# the code below has no references to the operand stack, only to the functions above

def main():
    while (True):
        printOperands()
        token = raw_input(" > ")
        if isOperand(token):
            operand = float(token)
            pushOperand(operand)
        elif token == "exit":
            break
        elif token == "+":
            plus()
        elif token == "-":
            minus()
        else:
            print("Unsupported operator: " + token)
    print("program exited")

main()