...
Reglene for hvordan funksjonsark kommer på toppen av eksisterende ark er litt mer komplisert enn dette. Hvorfor er det f.eks. slik at hasOperand-arket refererer til rpncalc2-arket? Regelen er at funksjonsarket refererer til samme ark som funksjonen selv er definert i! rpncalc2-arket inneholder strengt tatt ikke bare variabler, men også funksjoner , (evt. kan en se på funksjoner som variabler som har funksjoner som verdi. Figuren under viser i detalj ), slik vi viser i figurene under. Disse viser hva som skjer når plus-funksjonen kalles og videre kaller hasOperands:
PlantUML Macro |
---|
object rpncalc2 {
operands = []
hasOperands(n)
plus()
token = "+"
operand = ...
}
object "1: plus" as plus1 {
}
rpncalc2 <-left- plus1 |
| plus-funksjonen er akkurat kalt fra elif-grenen i while-løkka. plus-arket refererer til rpncalc2-arket, fordi plus-funksjonen selv er definert i rpncalc2-arket. Dermed kan koden i plus-funksjonen referere til variabler (og funksjoner) i rpncalc2-arket. |
PlantUML Macro |
---|
object rpncalc2 {
operands = []
hasOperands(n)
plus()
token = "+"
operand = ...
}
object "1: plus" as plus1 {
}
object "1: hasOperand" as hasOperand1 {
n = 2
}
rpncalc2 <-- plus1
rpncalc2 <-- hasOperand1 |
| plus-funksjonen har akkurat kalt hasOperands. Vi har nå to aktive funksjonsark, og merk hvordan begge refererer til rpncalc2-arket, fordi både plus- og hasOperands-funksjonene selv er definert der. Men selv om hasOperands-arket ble aktivert av plus-funksjonen, så refererer det ikke til plus-arket. |
For ordens skyld, nedenfor er hele rpncalc2-koden. Kjør den gjerne og sjekk at den virker! Har vi plantet noen feil i koden denne gangen?
Code Block |
---|
|
# rpncalc2.py
operands = []
def isOperand(token):
return token[0].isdigit()
def hasOperands(n):
return len(operands) >= n
def plus():
if hasOperands(2):
operands.append(operands.pop() + operands.pop())
def minus():
if hasOperands(2):
operands.append(- (operands.pop() - operands.pop()))
while (True):
print(operands)
token = raw_input(" > ")
if isOperand(token):
operand = float(token)
operands.append(operand)
elif token == "exit":
break
elif token == "+":
plus()
elif token == "-":
minus()
else:
print("Unsupported operator: " + token)
print("program exited") |