scratch/proglangs/rpn-go/words.go
2024-12-26 14:02:40 -03:00

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
}