98 lines
1.6 KiB
Go
98 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
func binOp(stack *Stack, op func(StackType, StackType) StackType) error {
|
|
v1, err := stack.pop()
|
|
v2, err := stack.pop()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
stack.push(op(v1, v2))
|
|
return nil
|
|
}
|
|
|
|
func natAdd(stack *Stack) error {
|
|
return binOp(stack, func(y StackType, x StackType) StackType {
|
|
return x + y
|
|
})
|
|
}
|
|
|
|
func natSub(stack *Stack) error {
|
|
return binOp(stack, func(y StackType, x StackType) StackType {
|
|
return x - y
|
|
})
|
|
}
|
|
|
|
func natMul(stack *Stack) error {
|
|
return binOp(stack, func(y StackType, x StackType) StackType {
|
|
return x * y
|
|
})
|
|
}
|
|
|
|
func natDiv(stack *Stack) error {
|
|
return binOp(stack, func(y StackType, x StackType) StackType {
|
|
return x / y
|
|
})
|
|
}
|
|
|
|
func natMod(stack *Stack) error {
|
|
return binOp(stack, func(y StackType, x StackType) StackType {
|
|
return x % y
|
|
})
|
|
}
|
|
|
|
func natPrint(stack *Stack) error {
|
|
val, err := stack.pop()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("%d\n", val)
|
|
return nil
|
|
}
|
|
|
|
func natPrintStack(stack *Stack) error {
|
|
if stack.pos == 0 {
|
|
return nil
|
|
}
|
|
for _, v := range stack.data {
|
|
fmt.Printf("%d ", v)
|
|
}
|
|
fmt.Println("")
|
|
return nil
|
|
}
|
|
|
|
func natDup(stack *Stack) error {
|
|
val := stack.data[stack.pos-1]
|
|
stack.push(val)
|
|
return nil
|
|
}
|
|
|
|
func natDrop(stack *Stack) error {
|
|
if _, err := stack.pop(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func natRnd(stack *Stack) error {
|
|
stack.push(42)
|
|
return nil
|
|
}
|
|
|
|
func natBye(stack *Stack) error {
|
|
os.Exit(0)
|
|
return nil
|
|
}
|
|
|
|
func natHelp(stack *Stack) error {
|
|
fmt.Println("Defined words:")
|
|
for k := range Dictionary {
|
|
fmt.Print(k, " ")
|
|
}
|
|
fmt.Print("\n")
|
|
return nil
|
|
}
|