Basic Feature Complete
This commit is contained in:
parent
c0d64ecb76
commit
d9fbebffdd
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,6 +4,7 @@
|
|||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
stc
|
||||||
|
|
||||||
# Test binary, build with `go test -c`
|
# Test binary, build with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
|
85
main.go
Normal file
85
main.go
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var stack []float64
|
||||||
|
|
||||||
|
func pop() float64 {
|
||||||
|
var x float64
|
||||||
|
if len(stack) > 0 {
|
||||||
|
x, stack = stack[len(stack)-1], stack[:len(stack)-1]
|
||||||
|
}
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func push(v float64) {
|
||||||
|
stack = append(stack, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addOp(v1, v2 float64) float64 {
|
||||||
|
fmt.Printf("%f + %f = %f\n", v1, v2, (v1 + v2))
|
||||||
|
return v1 + v2
|
||||||
|
}
|
||||||
|
func subtractOp(v1, v2 float64) float64 {
|
||||||
|
fmt.Printf("%f - %f = %f\n", v1, v2, (v1 - v2))
|
||||||
|
return v1 - v2
|
||||||
|
}
|
||||||
|
func multiplyOp(v1, v2 float64) float64 {
|
||||||
|
fmt.Printf("%f * %f = %f\n", v1, v2, (v1 * v2))
|
||||||
|
return v1 * v2
|
||||||
|
}
|
||||||
|
func divideOp(v1, v2 float64) float64 {
|
||||||
|
fmt.Printf("%f / %f = %f\n", v1, v2, (v1 / v2))
|
||||||
|
return v1 / v2
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("vim-go")
|
||||||
|
var in string
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
for {
|
||||||
|
fmt.Print(stack)
|
||||||
|
fmt.Print(" > ")
|
||||||
|
in, _ = reader.ReadString('\n')
|
||||||
|
in = strings.TrimSpace(in)
|
||||||
|
switch in {
|
||||||
|
case ".":
|
||||||
|
break
|
||||||
|
case "+":
|
||||||
|
doStackOperation(addOp)
|
||||||
|
case "-":
|
||||||
|
doStackOperation(subtractOp)
|
||||||
|
case "*":
|
||||||
|
doStackOperation(multiplyOp)
|
||||||
|
case "/":
|
||||||
|
doStackOperation(divideOp)
|
||||||
|
default:
|
||||||
|
val, err := strconv.ParseFloat(in, 64)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
fmt.Println("Valid inputs: +, -, /, *, <float>")
|
||||||
|
fmt.Println("'.' by itself to quit")
|
||||||
|
} else {
|
||||||
|
push(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in == "." {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func doStackOperation(op func(float64, float64) float64) {
|
||||||
|
if len(stack) < 2 {
|
||||||
|
fmt.Println("Not enough on stack to add")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v1, v2 := pop(), pop()
|
||||||
|
push(op(v1, v2))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user